我有一个多行字符串,我想对每一行执行操作,像这样:
inputString = """Line 1
Line 2
Line 3"""
我想要对每一行进行迭代:
for line in inputString:
doStuff()
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.split(os.linesep)
会使用特定于平台的换行符来分割字符串。 - James请使用inputString.splitlines()
。
splitlines
splitlines
可以正确处理换行符,而split
则不然。
当传入True
参数时,splitlines
可选择将分割结果中的换行符包含在内,这在某些特定场景下非常有用。
split("\n")
使用split
会在跨操作系统共享文件时产生非常混乱的bug。
在Python中,\n
表示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
转换为平台的换行符表示。
然而,在 Unix 系统上,只有二进制模式。在 UNIX 系统中使用 split('\n')
与 Windows 文件会导致意外行为。这也可能发生在网络传输文件时。
splitlines
方法会在任何换行符处分割字符串。例如,在Unix系统中读取Windows文件时,使用split(os.linesep)
会导致错误。 - loopbackbee在这种情况下可能有些过度,但另一种选择是使用StringIO
来创建一个类似文件的对象。
for line in StringIO.StringIO(inputString):
doStuff()
str.split
相比,这种方法的优点是不需要分配任何内存(它原地读取字符串)。缺点是如果使用StringIO
,速度会慢得多(约为50倍)。然而,如果使用**cStringIO
**,速度会快约2倍。 - loopbackbeetry:
import cStringIO
StringIO = cStringIO
except ImportError:
import StringIO
for line in StringIO.StringIO(variable_with_multiline_string):
pass
print line.strip()
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])
from io import StringIO
for sline in sio.readlines():
print(sline)
''.splitlines() == []
,而不是像''.split('\n')
一样为['']
。 - user1804599