Python解析一个巨大文件

3
我正在寻找一种高效的方法来加载一个包含大量数据的文件。
该文件的格式如下:
1\tword1\tdata
2\tword2\tdata
3\tword3\tdata
\r\n
1\tword4\tdata
2\tword2\tdata
\r\n
其中,\r\n定义了由单词组成的句子的结尾。
我想要加载该文件并保存其结构,即我想要引用句子和句子中的单词。总的来说,我想要得到像这样的结果。
data = [sentence1, sentence2,... ]

其中 sentence = [word1,word2,...]

逐行加载文件需要很长时间,按批次加载文件更加高效,但是我不知道如何解析和划分数据到句子中。

目前我使用以下代码

def loadf(filename):
    n = 100000
    data = []
    with open(filename) as f:
        while True:
            next_n_lines = list(islice(f, n))
            if not next_n_lines:
                break
            data.extend([line.strip().split('\t') for line in next_n_lines])

使用这段代码,我不知道如何将数据分成句子,此外我怀疑extend并没有实际上扩展当前列表,而是创建一个新的并重新赋值,因为它非常慢。

我会非常感谢任何帮助。


3
逐行加载文件需要很长时间,以批次加载文件更有效率。你确定吗?你实际测试过吗?Python 会分块读取文件并提供给行迭代器,因此你不需要自己处理。 - user2357112
文件大小大约是多少? - Tim Zimmermann
@TimZimmermann,约700Mb。 - user16168
@user2357112,让我重新表述一下,对一批行运行extend比每次append每一行更快。 - user16168
1
@TimZimmermann:你可能会使用输入重定向符号<而不是cat - user2357112
显示剩余4条评论
1个回答

4
怎么样:
import csv
from itertools import groupby

with open(yourfile) as fin:
    tabin = csv.reader(fin, delimiter='\t')
    sentences = [[el[1] for el in g] for k, g in groupby(tabin, bool) if k]

太棒了,只需要几秒钟,非常感谢! - user16168

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接