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

bra*_*ray 264 python string

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

inputString = """Line 1
Line 2
Line 3"""
Run Code Online (Sandbox Code Playgroud)

我想做类似以下的事情:

for line in inputString:
    doStuff()
Run Code Online (Sandbox Code Playgroud)

Unk*_*ech 398

inputString.splitlines()
Run Code Online (Sandbox Code Playgroud)

将为您提供每个项目的列表,该splitlines()方法旨在将每一行拆分为一个列表元素.

  • 这也使`''..splitlines()== []`,而不是'''''与'''.''('\n')`一样. (17认同)
  • +1.我认为这比接受的解决方案更好,因为它没有明确地与行分隔符混淆.这一切都只适用于专用的API方法! (12认同)
  • @lpapp,我完全同意.splitlines()在语义上(和功能上,因为它使用通用换行符并省略尾随空行)比split('\n')更好.那时候(2008年)我只是一个新手Pythonista,虽然我的脚本现在显示我也几乎只使用splitlines().因此,我删除了我的104分答案(_*sob ......*_),并将支持这一点. (11认同)

efo*_*nis 195

像其他人说的那样:

inputString.split('\n')  # --> ['Line 1', 'Line 2', 'Line 3']
Run Code Online (Sandbox Code Playgroud)

这与上面的相同,但不推荐使用字符串模块的功能,应该避免使用:

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

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

inputString.splitlines(True)  # --> ['Line 1\n', 'Line 2\n', 'Line 3']
Run Code Online (Sandbox Code Playgroud)

  • @Jeremy:三引号字符串文字总是使用'​​\n'EOL,无论平台如何.文件模式也是如此. (20认同)
  • `inputString.split(os.linesep)`将使用平台特定的行终止符. (16认同)
  • 这仅适用于使用'\n'作为行终止符的系统. (10认同)
  • 奇怪的是,这个答案是如此受欢迎.硬编码'\n'是一个坏主意,但即使你使用os.linesep而不是那个,你也会遇到Linux上的Windows行终端问题,反之亦然等等.此外,它正在推广带有True参数的分割线,这是可能是不太常见的使用方式...... (10认同)
  • 次优方法,不赞成方法和最优方法的冗余变量的组合. (4认同)
  • 链接到该方法:http://docs.python.org/2/library/stdtypes.html#str.splitlines (3认同)
  • 最好的方法可能是`splitlines`.`os.linesep`是一个普通的错误,比''\n'更糟糕.如果您使用的是Windows,则可能仍会获得Unix文本.然后你的线将不会拆分.如果你在Windows文本上使用''\n'`,那么最糟糕的情况是你会得到虚假的`\ r`字符,可以使用`.strip()`来清理 - 你通常也想调用它. (3认同)

gon*_*opp 47

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

splitlines()正确处理新行,不像split("\n").

它还具有@efotinis提到的优点,当使用True参数调用时,可选择在分割结果中包含换行符.


关于你不应该使用的原因的详细解释split("\n"):

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

print例如,即使您的字符串结尾与您的平台不匹配,也能正常工作:

>>> print " a \n b \r\n c "
 a 
 b 
 c
Run Code Online (Sandbox Code Playgroud)

但是,显式拆分"\n"将产生与平台相关的行为:

>>> " a \n b \r\n c ".split("\n")
[' a ', ' b \r', ' c ']
Run Code Online (Sandbox Code Playgroud)

即使您使用os.linesep它,它也只会根据您平台上的换行符分隔符进行拆分,如果您正在处理在其他平台上创建的文本,或者使用裸机,则会失败\n:

>>> " a \n b \r\n c ".split(os.linesep)
[' a \n b ', ' c ']
Run Code Online (Sandbox Code Playgroud)

splitlines 解决了所有这些问题:

>>> " a \n b \r\n c ".splitlines()
[' a ', ' b ', ' c ']
Run Code Online (Sandbox Code Playgroud)

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

  • @lpapp注意`splitlines`将在*任何*行结束时拆分.例如,在unix中读取Windows文件时,`split(os.linesep)`将失败 (5认同)

iru*_*var 19

在这种特殊情况下可能有点过分,但另一种选择涉及使用StringIO创建类似文件的对象

for line in StringIO.StringIO(inputString):
    doStuff()
Run Code Online (Sandbox Code Playgroud)

  • 与`str.split`相比,此方法的一个优点是**不需要分配任何内存**(它就地读取字符串).缺点是如果你使用`StringIO`**(大约50x),它会慢得多.但是,如果使用**`cStringIO`,它的速度提高了约2倍** (3认同)