如何将多行字符串拆分为多行?

时间:2008-10-05 18:46:27

标签: python string

我有一个多行字符串文字,我想对每一行进行操作,如下所示:

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

我想做以下事情:

for line in inputString:
    doStuff()

6 个答案:

答案 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")的原因的详细说明:

在Python中,

\n表示Unix换行符(ASCII十进制代码10),独立于运行它的平台。但是,the linebreak representation is platform-dependent。在Windows上,\n是两个字符CRLF(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])