我有一个多行字符串文字,我想对每一行进行操作,如下所示:
inputString = """Line 1
Line 2
Line 3"""
我想做以下事情:
for line in inputString:
doStuff()
答案 0 :(得分:370)
inputString.splitlines()
将为每个项目提供一个列表,splitlines()
方法旨在将每一行拆分为一个列表元素。
答案 1 :(得分:196)
像其他人说的那样:
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 :(得分:45)
使用str.splitlines()
。
splitlines()
不同, split("\n")
正确处理换行符。
@efotinis提到的优点是,当使用True
参数调用时,可选择在分割结果中包含换行符。
有关您不应使用split("\n")
的原因的详细说明:
\n
表示Unix换行符(ASCII十进制代码10),独立于运行它的平台。但是,the linebreak representation is platform-dependent。在Windows上,\n
是两个字符CR
和LF
(ASCII十进制代码13和10,AKA \r
和\n
),而在任何现代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 ']
Reading files in text mode可以部分缓解换行表示问题,因为它将Python的\n
转换为平台的换行符表示形式。
但是,文本模式仅存在于Windows上。在Unix系统上,所有文件都以二进制模式打开,因此在UNIX系统中使用带有Windows文件的split('\n')
会导致意外行为。此外,从其他来源处理具有可能不同的换行符的字符串并不罕见,例如来自套接字。
答案 3 :(得分:19)
在这种特殊情况下可能有些过分,但另一种选择是使用StringIO
来创建类似文件的对象
for line in StringIO.StringIO(inputString):
doStuff()
答案 4 :(得分:1)
我希望评论有正确的代码文本格式,因为我认为@ 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()
答案 5 :(得分:1)
原始帖子要求提供代码,该代码将打印一些行(如果在某些情况下是正确的),则打印下一行。 我的实现是这样:
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])