如何将多行字符串拆分成多行?
- 2025-02-20 09:24:00
- admin 原创
- 67
问题描述:
我有一个多行字符串,我想对每一行执行一个操作,如下所示:
inputString = """Line 1
Line 2
Line 3"""
我想在每一行上进行迭代:
for line in inputString:
doStuff()
解决方案 1:
inputString.splitlines()
将为您提供一个包含每个项目的列表,该splitlines()
方法旨在将每一行拆分为一个列表元素。
解决方案 2:
inputString.split('
') # --> ['Line 1', 'Line 2', 'Line 3']
这与上面的相同,但是字符串模块的功能已被弃用,应避免使用:
import string
string.split(inputString, '
') # --> ['Line 1', 'Line 2', 'Line 3']
或者,如果您希望每行都包含换行序列 (CR,LF,CRLF),请使用splitlines
带有True
参数的方法:
inputString.splitlines(True) # --> ['Line 1
', 'Line 2
', 'Line 3']
解决方案 3:
使用inputString.splitlines()
。
为什么splitlines
更好
splitlines
正确处理换行符,与 不同split
。
当使用参数调用时,它还可以选择返回拆分结果中的换行符True
,这在某些特定场景中很有用。
为什么不应该使用`split("
")`
split
跨操作系统共享文件时使用会产生非常令人困惑的错误。
`
`Python 中的 表示 Unix 换行符(ASCII 十进制代码 10),与运行它的操作系统无关。但是,ASCII 换行符表示依赖于操作系统。
在 Windows 上,`是两个字符,
CR和
LF(ASCII 十进制代码 13 和 10,
和
),而在现代 Unix(Mac OS X、Linux、Android)上,它是单个字符
LF`。
print
即使字符串的行尾与您的平台不匹配,也可以正常工作:
>>> print " a
b
c "
a
b
c
但是,明确地拆分“\n”具有依赖于操作系统的行为:
>>> " a
b
c ".split("
")
[' a ', ' b
', ' c ']
即使你使用os.linesep
,它也只会根据你所在平台的换行符进行拆分,如果你处理在其他平台上创建的文本或使用裸 ,它将失败`
`:
>>> " a
b
c ".split(os.linesep)
[' a
b ', ' c ']
splitlines
解决所有这些问题:
>>> " a
b
c ".splitlines()
[' a ', ' b ', ' c ']
以文本模式读取文件可以部分缓解换行符表示问题,因为它将 Python 的换行符表示转换`
`为平台的换行符表示。
但是文本模式只存在于 Windows 上。在 Unix 系统上,所有文件都以二进制模式打开,因此`split('
')`在 UNIX 系统中使用 Windows 文件会导致不良行为。在网络中传输文件时也会出现这种情况。
解决方案 4:
在这种特殊情况下可能有点过头了,但另一种选择是使用StringIO
创建类似文件的对象
for line in StringIO.StringIO(inputString):
doStuff()
解决方案 5:
原始帖子要求提供打印某些行(如果它们对某些条件成立)以及以下行的代码。我的实现如下:
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])
解决方案 6:
我想补充@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()
解决方案 7:
在 Python3 中使用此代码
from io import StringIO
for sline in sio.readlines():
print(sline)
扫码咨询,免费领取项目管理大礼包!