将多行文本文件拆分成单个列表?

时间:2014-02-16 01:46:39

标签: python list

我需要一些帮助来弄清楚如何将文本文件中的单词拆分成列表。我可以使用这样的东西:

words = []
for line in open('text.txt'):
    line.split()
    words.append(line)

但如果文件包含多行文本,则会将它们拆分为子列表,例如

this is the first line
this is the second line

变为:

[['this', 'is', 'the', 'first', 'line'], ['this', 'is', 'the', 'second', 'line']]

如何制作它们以使它们在同一个列表中?即。

[['this', 'is', 'the', 'first', 'line', 'this', 'is', 'the', 'second', 'line']]

谢谢!

编辑: 该程序将打开多个文本文件,因此需要将每个文件中的单词添加到子列表中。因此,如果文件有多行,则这些行中的所有单词应一起存储在子列表中。 即每个新文件都会启动一个新的子列表。

3 个答案:

答案 0 :(得分:3)

你可以使用列表理解来平整单词列表

[word for words in line.split() for word in words]

这与写作

相同
result = []
for words in line.split():
    for word in words:
       result.append(word)

或者你可以使用itertools.chain.from_iterable,就像这样

from itertools import chain
with open("Input.txt") as input_file:
    print list(chain.from_iterable(line.split() for line in input_file))

答案 1 :(得分:3)

您的代码实际上并没有按照您的说法执行操作。 line.split()只返回行中的单词列表,您不做任何事情;它不会以任何方式影响line,因此当您执行words.append(line)时,您只需附加原始行,即单个字符串。

所以,首先,你必须解决这个问题:

words = []
for line in open('text.txt'):
    words.append(line.split())

现在,您正在做的是重复将新的单词列表附加到空列表中。所以当然你会得到一个单词列表。这是因为你混淆了the append and extend methods of listappend接受任何对象,并将该对象添加为列表的新元素; extend接受任何迭代,并将该iterable的每个元素添加为列表的单独新元素。

如果你也解决了这个问题:

words = []
for line in open('text.txt'):
    words.extend(line.split())

......现在你得到了你想要的东西。

答案 2 :(得分:1)

不确定为什么要保留[[]]但是:

words = [open('text.txt').read().split()]