我有一个多行字符串文字,我想在每一行上做一个操作,如下所示:
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()方法旨在将每一行拆分为一个列表元素.
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)
gon*_*opp 47
最好的方法是简单地使用str.splitlines().
splitlines()正确处理新行,不像split("\n").
它还具有@efotinis提到的优点,当使用True参数调用时,可选择在分割结果中包含换行符.
关于你不应该使用的原因的详细解释split("\n"):
\n在Python中,代表一个Unix换行符(ASCII十进制代码10),独立于运行它的平台.但是,换行符表示与平台有关.在Windows上,\n是两个字符,CR和LF(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文件会导致意外行为.此外,从其他来源(例如来自套接字)处理具有可能不同的换行符的字符串并不罕见.
iru*_*var 19
在这种特殊情况下可能有点过分,但另一种选择涉及使用StringIO创建类似文件的对象
for line in StringIO.StringIO(inputString):
doStuff()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
414444 次 |
| 最近记录: |