【问题标题】:Python parsing a huge filePython解析一个巨大的文件
【发布时间】:2013-12-18 07:08:41
【问题描述】:

我正在寻找有效的方法来加载包含数据的大文件。

文件格式如下

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 实际上并没有扩展当前列表,而是创建一个新列表并重新分配,因为它非常慢。

我将不胜感激。

【问题讨论】:

  • “逐行加载文件需要很多时间,批量加载文件效率更高” - 你确定吗?你真的计时了吗? Python 以块的形式读取文件以提供行迭代器,因此您不必自己处理。
  • 文件大小大约是多少?
  • @TimZimmermann,~700Mb
  • @user2357112,让我换个说法,在批次上运行extend 比每次每行运行append 都要快。
  • @TimZimmermann:您可能会使用 < 而不是 cat 的输入重定向。

标签: python file parsing


【解决方案1】:

怎么样:

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]

【讨论】:

  • 太棒了,只需几秒钟,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2013-11-07
  • 2014-07-22
  • 2013-03-31
  • 2014-08-18
相关资源
最近更新 更多