如何将多行string拆分为多行?

我有一个多行string文字,我想在每一行上执行操作,如下所示:

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

我想要做如下的事情:

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

将为每个项目提供一个列表, splitlines()方法用于将每行分割为一个列表元素。

像其他人一样说:

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

这和上面的是一样的,但是string模块的function已经被废弃了,应该避免:

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

或者,如果您希望每行包含中断序列(CR,LF,CRLF),请使用具有True参数的splitlines方法:

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

最好的方法是简单地使用str.splitlines

splitlines()正确处理换行符,不像split("\n")

它还具有@efotinis提到的优点,在使用True参数调用时,可以在拆分结果中select性地包含换行符。


详细解释为什么你不应该使用split("\n")

\n在Python中,代表一个Unix行换行符(ASCII十进制代码10),与运行它的平台无关。 但是, 换行符表示是平台相关的 。 在Windows上, \n是两个字符, CRLF (ASCII十进制码13和10,AKA \r\n ),而在任何现代Unix(包括OS X)上,都是单个字符LF

print ,例如,即使您有一个string结尾不匹配您的平台正确工作:

 >>> print " a \nb \r\nc " abc 

但是,明确地分割“\ n”将产生平台相关的行为:

 >>> " a \nb \r\nc ".split("\n") [' a ', ' b \r', ' c '] 

即使使用os.linesep ,它也只会根据平台上的换行符进行拆分,如果您正在处理在其他平台中创build的文本,或者仅使用\n

 >>> " a \nb \r\nc ".split(os.linesep) [' a \nb ', ' c '] 

splitlines解决了所有这些问题:

 >>> " a \nb \r\nc ".splitlines() [' a ', ' b ', ' c '] 

以文本模式读取文件部分减轻了换行表示的问题,因为它将Python的\n转换为平台的换行表示。 但是,文本模式仅在Windows上存在。 在Unix系统中,所有文件都以二进制模式打开,因此在UNIX系统中使用Windows文件时使用split('\n')会导致不希望的行为。 此外,处理来自其他来源(例如来自套接字)的可能不同的换行符的string并不罕见。

在这种特殊情况下可能会过度,但另一种select是使用StringIO来创build一个类似文件的对象

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

我希望评论有正确的代码文本格式,因为我认为@ 1_CR的答案需要更多的颠簸,我想扩大他的答案。 无论如何,他引导我采取以下技术。 它会使用cStringIO如果可用(但注意:cStringIO和StringIO是不一样的 ,因为你不能inheritancecStringIO …这是一个内置的…但基本操作的语法将是相同的,所以你可以做到这一点):

 try: import cStringIO StringIO = cStringIO except ImportError: import StringIO for line in StringIO.StringIO(variable_with_multiline_string): pass print line.strip()