Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将多行字符串拆分为多行?_Python_String - Fatal编程技术网

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

Python 如何将多行字符串拆分为多行?,python,string,Python,String,我有一个多行字符串文本,我想对每行执行一个操作,如下所示: inputString = """Line 1 Line 2 Line 3""" 我想做如下事情: for line in inputString: doStuff() inputString.splitlines() 将为您提供一个包含每个项目的列表,该方法旨在将每一行拆分为一个列表元素。如其他人所说: inputString.split('\n') # --> ['Line 1', 'Line 2', 'Lin

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

inputString = """Line 1
Line 2
Line 3"""
我想做如下事情:

for line in inputString:
    doStuff()
inputString.splitlines()
将为您提供一个包含每个项目的列表,该方法旨在将每一行拆分为一个列表元素。

如其他人所说:

inputString.split('\n')  # --> ['Line 1', 'Line 2', 'Line 3']
这与上述内容相同,但字符串模块的函数已弃用,应避免使用:

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

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

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

使用
str.splitlines()

splitlines()

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


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

\n
在Python中表示Unix换行符(ASCII十进制代码10),与运行它的平台无关。然而。在Windows上,
\n
是两个字符,
CR
LF
(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')
将导致不希望出现的行为。此外,处理可能与其他来源(如套接字)的换行符不同的字符串也很常见。

我希望注释具有正确的代码文本格式,因为我认为@1_CR的答案需要更多的颠簸,我想补充他的答案。不管怎么说,他让我学到了以下技巧:;如果可用,它将使用cStringIO(但注意:cStringIO和StringIO不相同,因为您不能将cStringIO子类化…它是内置的…但对于基本操作,语法将相同,因此您可以这样做):


原始post请求的代码打印了一些行(如果在某些条件下为true)加上下一行。 我的实施将是:

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

这只适用于使用“\n”作为行终止符的系统。@Jeremy:无论平台如何,三引号字符串文字始终使用“\n”下线。以文本模式读取文件也是如此。
inputString.split(os.linesep)
将使用平台特定的行终止符。奇怪的是,这个答案如此上浮。硬编码“\n”是个坏主意,但即使您使用os.linesep而不是os.linesep,您在Linux上的windows行结束也会有问题,反之亦然。此外,它使用True argument来提升拆分行,这可能是不太常见的使用方式……一种次优方法、一种不推荐的方法的组合,以及优化方法的冗余变化。我认为这比公认的解决方案更好,因为它不会显式地弄乱行分隔符。这一切都只是一个专用的API方法@我完全同意。splitlines()在语义上(和功能上,因为它使用通用换行符并省略了尾随的空行)优于split('\n')。当时(2008年)我只是一个新的Pythonista和grepping,尽管我的脚本现在显示我也几乎完全使用splitlines()。因此,我将删除我的104点答案(*sob…*),并将支持此答案。这也使得
'.splitlines()=[]
,而不是
['']
。split('\n')
。这种比较不公平,因为您也可以使用split(os.linesep),要避免平台特定位。@lpapp请注意,
splitlines
将在任何行结束时分割
split(os.linesep)
在unix中读取windows文件时将失败,例如,在我的情况下使用splitlines的另一个原因,谢谢。我的分数是+1。我个人甚至会将注释中的信息合并到您的答案中。是的,这是最惯用、最Python的ic方法。与
str.split
相比,这种方法的一个优点是不需要分配任何内存(它就地读取字符串)。缺点是,如果使用
StringIO
(大约50倍),速度会慢得多。但是,如果您使用
cStringIO
,它大约比什么快2倍?IrinaRapoport,cStringIO比StringIO快2倍
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])