问题:如何将多行字符串分成多行?
我有一个多行字符串文字,我想在每一行上执行一个操作,如下所示:
inputString = """Line 1
Line 2
Line 3"""
我想做以下事情:
for line in inputString:
doStuff()
回答 0
inputString.splitlines()
将为您提供每个项目的列表,该splitlines()
方法旨在将每一行拆分为一个列表元素。
回答 1
就像其他人说的:
inputString.split('\n') # --> ['Line 1', 'Line 2', 'Line 3']
与上面的相同,但是不建议使用字符串模块的功能,应避免使用:
import string
string.split(inputString, '\n') # --> ['Line 1', 'Line 2', 'Line 3']
另外,如果您希望每行都包含中断顺序(CR,LF,CRLF),请将该splitlines
方法与True
参数一起使用:
inputString.splitlines(True) # --> ['Line 1\n', 'Line 2\n', 'Line 3']
回答 2
使用str.splitlines()
。
splitlines()
不同于,可以正确处理换行符split("\n")
。
它也具有@efotinis提到的优点,当使用True
参数调用时,可以在拆分结果中选择性地包括换行符。
为什么不应该使用的详细说明split("\n")
:
\n
在Python中,代表Unix换行符(ASCII十进制代码10),独立于运行它的平台。但是,换行表示形式取决于平台。在Windows上,\n
是两个字符CR
和LF
(ASCII十进制码13和10,\r
又\n
称为AKA 和),而在任何现代Unix(包括OS X)上,它都是单个字符LF
。
print
,例如,即使您有一个行尾与平台不匹配的字符串也可以正常工作:
>>> print " a \n b \r\n c "
a
b
c
但是,在“ \ n”上进行显式拆分将产生与平台有关的行为:
>>> " a \n b \r\n c ".split("\n")
[' a ', ' b \r', ' c ']
即使你使用了os.linesep
,它只会根据你的平台上的换行分隔符分开,并会失败,如果你在处理文本创建在其他平台上,或用裸\n
:
>>> " a \n b \r\n c ".split(os.linesep)
[' a \n b ', ' c ']
splitlines
解决了所有这些问题:
>>> " a \n b \r\n c ".splitlines()
[' a ', ' b ', ' c ']
以文本模式读取文件可以部分缓解换行符表示问题,因为它将Python \n
转换为平台的换行符表示形式。但是,文本模式仅在Windows上存在。在Unix系统上,所有文件都以二进制模式打开,因此split('\n')
在带有Windows文件的UNIX系统中使用将导致不良行为。同样,使用与其他来源(例如来自套接字)的换行符可能不同的字符串来处理字符串也很常见。
回答 3
在这种特殊情况下可能会过大,但另一个选择涉及使用StringIO
创建文件状对象
for line in StringIO.StringIO(inputString):
doStuff()
回答 4
原始帖子要求提供代码,该代码将打印一些行(如果在某些情况下是正确的),则打印下一行。我的实现是这样的:
text = """1 sfasdf
asdfasdf
2 sfasdf
asdfgadfg
1 asfasdf
sdfasdgf
"""
text = text.splitlines()
rows_to_print = {}
for line in range(len(text)):
if text[line][0] == '1':
rows_to_print = rows_to_print | {line, line + 1}
rows_to_print = sorted(list(rows_to_print))
for i in rows_to_print:
print(text[i])
回答 5
我希望注释的代码文本格式正确,因为我认为@ 1_CR的答案需要更多的修改,并且我想扩大他的答案。无论如何,他使我领会了以下技巧:如果可用,它将使用cStringIO(但请注意:cStringIO和StringIO 不相同,因为您不能将cStringIO子类化。。。它是内置的。但是对于基本操作,语法将是相同的,因此您可以这样做):
try:
import cStringIO
StringIO = cStringIO
except ImportError:
import StringIO
for line in StringIO.StringIO(variable_with_multiline_string):
pass
print line.strip()