如何将多行字符串分割成多行?

我有一个多行字符串,我想在每一行上做一个操作,如下所示:

inputString = """Line 1
Line 2
Line 3"""

我想迭代每一行:

for line in inputString:
doStuff()
520445 次浏览
inputString.splitlines()

会给你一个包含每一项的列表,splitlines()方法被设计成将每行分割成一个列表元素。

就像其他人说的

inputString.split('\n')  # --> ['Line 1', 'Line 2', 'Line 3']

这与上面的相同,但string模块的函数是不赞成的,应该避免使用:

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']

在这种特殊情况下可能是多余的,但另一种选择涉及使用StringIO创建一个类文件对象

for line in StringIO.StringIO(inputString):
doStuff()

使用inputString.splitlines()


为什么splitlines更好

splitlines正确处理换行,不像split

当使用True参数调用时,它还可以选择返回拆分结果中的换行符,这在某些特定场景中非常有用。


为什么你不应该使用split("\n")

在跨操作系统共享文件时,使用split会产生非常令人困惑的错误。

\n在Python中表示Unix换行符(ASCII十进制代码10),与运行它的操作系统无关。然而,ASCII的换行表示依赖于操作系统

在Windows上,\n是两个字符,CRLF (ASCII十进制代码13和10,\r\n),而在现代Unix (Mac OS X, Linux, Android)上,它是单个字符LF

print工作正确,即使你有一个字符串的行结束不匹配你的平台:

>>> print " a \n b \r\n c "
a
b
c

然而,在"\n"上显式分裂,具有os依赖行为:

>>> " 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系统上,所有文件都以二进制模式打开,因此在Unix系统中对Windows文件使用split('\n')将导致不希望的行为。在网络中传输文件时也会发生这种情况。

我希望注释有适当的代码文本格式,因为我认为@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()

原始帖子请求的代码打印一些行(如果它们在某些条件下为真)加上下面的行。 我的实现是这样的:

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])