Python 如何将行作为单个字符串项添加到列表中?

Python 如何将行作为单个字符串项添加到列表中?,python,python-2.7,Python,Python 2.7,我正在尝试向列表中添加文本行。我有以下代码: theText = 'foo \n bar' for line in theText: theList.append(line) print theList 此代码打印: ['f', 'o', 'o', ' ', '\n', ' ', 'b', 'a', 'r'] 当我期待更像: ['foo ', '\n bar'] 有什么方法可以使整行成为列表中的单个字符串项目吗?您需要按换行符拆分字符串。否则,它将读取字符串中的每个字符重新拆分将保

我正在尝试向列表中添加文本行。我有以下代码:

theText = 'foo \n bar'
for line in theText:
    theList.append(line)
print theList
此代码打印:

['f', 'o', 'o', ' ', '\n', ' ', 'b', 'a', 'r']
当我期待更像:

['foo ', '\n bar']

有什么方法可以使整行成为列表中的单个字符串项目吗?

您需要按换行符拆分字符串。否则,它将读取字符串中的每个字符<如果将分隔符保存在捕获组中,则代码>重新拆分将保留分隔符:

import re
...
for line in re.split( '(\n)',theText ):
    theList.append(line)
但是,这会将换行符放在单独的项目中,如下所示:

['foo ','\n',' bar']
建议使用
re.findall
,这将为您提供预期的输出:

for line in re.findall( '(\n?.+)',theText ):
    theList.append(line)
或者,如果要排除分隔符,可以完全忽略正则表达式,只使用
str.split

for line in theText.split('\n'):
    theList.append(line)

您需要按换行符拆分字符串。否则,它将读取字符串中的每个字符<如果将分隔符保存在捕获组中,则代码>重新拆分将保留分隔符:

import re
...
for line in re.split( '(\n)',theText ):
    theList.append(line)
但是,这会将换行符放在单独的项目中,如下所示:

['foo ','\n',' bar']
建议使用
re.findall
,这将为您提供预期的输出:

for line in re.findall( '(\n?.+)',theText ):
    theList.append(line)
或者,如果要排除分隔符,可以完全忽略正则表达式,只使用
str.split

for line in theText.split('\n'):
    theList.append(line)

您可以使用正则表达式:

re.findall('(\n?.+)', theText)
编辑:


只是为了澄清循环的行为。如果对字符串进行迭代(例如,字符串中的字符),则可以逐个字符地获取字符串。这与每个字符的索引一致(
char\u 0=string[0]
char\u 1=sring[1]
,…)。相反,文件对象的行为不同。对文件描述符的迭代产生文件的行。因此,如果您的文本是一个包含文本的文件,您将获得预期的结果。

您可以使用正则表达式:

re.findall('(\n?.+)', theText)
编辑:


只是为了澄清循环的行为。如果对字符串进行迭代(例如,字符串中的字符),则可以逐个字符地获取字符串。这与每个字符的索引一致(
char\u 0=string[0]
char\u 1=sring[1]
,…)。相反,文件对象的行为不同。对文件描述符的迭代产生文件的行。因此,如果您的文本是一个包含预期结果的文本的文件。

如果您需要该输出,请尝试以下操作:

result = [word if i==0 else "\n" + word for 
              i,word in enumerate(theText.splitlines())]
枚举
将其参数的结果与数字配对,例如:

enumerate("abcd") == [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] # roughly

因此,我们要在newline上拆分
文本
,如果它是句子中的第一个单词,请给我们单词本身,否则请在前面添加
“\n”

如果需要输出,请尝试以下操作:

result = [word if i==0 else "\n" + word for 
              i,word in enumerate(theText.splitlines())]
枚举
将其参数的结果与数字配对,例如:

enumerate("abcd") == [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] # roughly

因此,我们要在newline上拆分
文本
,如果它是句子中的第一个单词,则给我们单词本身,否则在前面添加
“\n”

使用纯python而不使用库,可以做的是:

theText = theText.split('\n')
['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
这将产生所需的输出:

>>> theText = theText.split('\n')
>>> ['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
['foo ', '\n bar']
>>> 
一步一步:

>>> theText = 'foo \n bar'
>>> theText = theText.split('\n')
>>> theText
['foo ', ' bar']
>>> [theText[i] for i in range(len(theText)) if i%2==1]
[' bar']
>>> ['\n'+theText[i] for i in range(len(theText)) if i%2==1]
['\n bar']
>>> ['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
['foo ', '\n bar']
>>>   

使用纯python而不使用库可以做到的是:

theText = theText.split('\n')
['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
这将产生所需的输出:

>>> theText = theText.split('\n')
>>> ['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
['foo ', '\n bar']
>>> 
一步一步:

>>> theText = 'foo \n bar'
>>> theText = theText.split('\n')
>>> theText
['foo ', ' bar']
>>> [theText[i] for i in range(len(theText)) if i%2==1]
[' bar']
>>> ['\n'+theText[i] for i in range(len(theText)) if i%2==1]
['\n bar']
>>> ['\n'+theText[i] if i%2==1 else theText[i] for i in range(len(theText))]
['foo ', '\n bar']
>>>   

如果要保留这些行并使用分隔符,请使用带有
keepends=True
,正确的结果是
['foo\n','bar']
,因为换行符位于带有foo not bar的行上:

theText = 'foo \n bar'
print(theText.splitlines(True))
['foo \n', ' bar']

如果要保留这些行并使用分隔符,请使用带有
keepends=True
,正确的结果是
['foo\n','bar']
,因为换行符位于带有foo not bar的行上:

theText = 'foo \n bar'
print(theText.splitlines(True))
['foo \n', ' bar']

@AdamSmith
partition
仅拆分字符串一次。一个更大的字符串将返回
['foo','\n','bar\n baz']
。我以为他想用它做更多的事情,而不仅仅是把它放在列表上,但你right@AdamSmith
partition
仅拆分字符串一次。一个更大的字符串将返回
['foo','\n','bar\n baz']
。我以为他想用它做更多的事情,而不仅仅是把它放在列表上,但你right@DavidReeve嗯,的确如此。我忘了除了在
re.S
模式下,
与换行符不匹配。我仍然认为以这种方式使用正则表达式太过分了。@davidree-hmmm确实如此。我忘记了
除了在
re.S
模式下之外,与换行符不匹配。我仍然认为以这种方式使用正则表达式是非常过分的。只有当
“foo\n bar\n baz”
的预期结果是
[“foo”、“\n bar”、“baz”]
而不是
[“foo”、“\n bar”、“\n baz”]
时,这才有效。在后一种情况下——我的答案是纯python,并生成该结果。坦白地说,我不知道OP为什么要保留空格和换行符!!!:)只有当
“foo\n bar\n baz”
的预期结果是
[“foo”、“\n bar”、“baz”]
而不是
[“foo”、“\n bar”、“\n baz”]
时,这才有效。在后一种情况下——我的答案是纯python,并生成该结果。坦白地说,我不知道OP为什么要保留空格和换行符!!!:)谢谢你的回复。似乎我误解了代码中使用的
line
是所提供字符串中某行的python关键字。我在网上的其他例子中看到了这种用法,并被误解了。显然,我可以在这里使用任意单词,它会引用字符串中的单个字符。有了这些知识,下面的
split
建议解决了我的问题。感谢您提供的有用回复。似乎我误解了代码中使用的
line
是所提供字符串中某行的python关键字。我在网上的其他例子中看到了这种用法,并被误解了。显然,我可以在这里使用任意单词,它会引用字符串中的单个字符。有了这些知识,下面的
split
建议解决了我的问题。