如何将多行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
是两个字符, CR
和LF
(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()