我有一个多行字符串,我想对每一行进行操作,如下所示:
inputString = """Line 1
Line 2
Line 3"""
我想在每一行上迭代:
for line in inputString:
doStuff()
inputString.splitlines()
会给你一个包含每个项目的列表,该splitlines()
方法旨在将每一行拆分为一个列表元素。
就像其他人说的:
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']
使用inputString.splitlines()
.
splitlines
更好splitlines
正确处理换行符,不像split
.
当使用参数调用时,它还可以选择在拆分结果中返回换行符True
,这在某些特定场景中很有用。
split("\n")
split
在跨操作系统共享文件时,使用会产生非常混乱的错误。
\n
在 Python 中表示 Unix 换行符(ASCII 十进制代码 10),与运行它的操作系统无关。但是,ASCII 换行表示是依赖于操作系统的。
在 Windows 上,\n
是两个字符,CR
和LF
(ASCII 十进制代码 13 和 10,\r
和\n
),而在现代 Unix(Mac OS X、Linux、Android)上,它是单个字符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 系统中使用会导致不良行为。在网络中传输文件时也会发生这种情况。
在这种特殊情况下可能有点矫枉过正,但另一种选择涉及使用StringIO
创建类似文件的对象
for line in StringIO.StringIO(inputString):
doStuff()
原始帖子要求打印一些行(如果它们在某些条件下为真)加上以下行的代码。我的实现是这样的:
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])
我希望评论有正确的代码文本格式,因为我认为 @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()