繁体   English   中英

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

[英]How do I split a multi-line string into multiple lines?

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

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 模块的函数,应避免使用:

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参数调用时可选择在拆分结果中包含换行符。


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

\\n在 Python 中,表示 Unix 换行符(ASCII 十进制代码 10),与运行它的平台无关。 但是,换行表示是平台相关的 在 Windows 上, \\n是两个字符, CRLF (ASCII 十进制代码 13 和 10,又名\\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 ']

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

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

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

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

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

我希望评论具有正确的代码文本格式,因为我认为 @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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM