以块为单位读取文本文件 - 丢失数据?

时间:2014-11-16 20:43:41

标签: python parsing text

我有一个巨大的文本文件,可以是2到20 GB。内容是来自给定查询列表的结果列表。我试图将它发送到我的'parse'脚本中,因为我需要将每组结果读入内存,以便我可以对它们进行索引操作。出于某种原因,当我将整个文件加载到内存中时,我获得的解析结果比使用以下代码将输入文件切换为块时更多:

with open(infile, 'r') as rfile:
    block = []
    thresh = 100000
    for i, line in enumerate(rfile):

        if i >= thresh:
            if "Iteration: 1" in line: # This marks the end of one set of results, and the beginning of the next, so we don't truncate any results
                read_block(block)
                thresh += 100000
                del block[:]

        block.append(line)

知道我为什么要丢失这段代码的数据?或者是一切都在这里犹豫不决,我的错误是这个函数与read_block()方法交互奇怪的结果......

1 个答案:

答案 0 :(得分:0)

这个嵌套的if可能会导致您出现问题(可能需要read_block的帮助):

if i >= thresh:
    if "Iteration: 1" in line:
        read_block(block)
        thresh += 100000
        del block[:]

它相当于复合if条件,因为如果两个条件都为真,它只运行最里面的块:

if i >= thresh and "Iteration: 1" in line:
    read_block(block)
    thresh += 100000
    del block[:]

因此,每当此循环遇到一小组结果 - 少于100,000行时,外部for循环继续在结果集中啜饮,直到它们的组合长度超过阈值。最后调用read_block时,将为其提供包含两个或更多集的block行。 read_block可以应对吗?

此外,如果您有一个特别长的结果集---或者任何组合的组合不能精确地累计超过100,000行 - 则在循环到达当前集的末尾之前完全忽略该阈值。如果你的其他函数假设block永远不会超过100,000行,那么他们会得到一个粗鲁的惊喜。

最后,thresh总是增加100,000,而不是实际读取多行。由于这不会发生在i >= thresh(可能大于)之后,thresh将落后于现实。如果该100,000行阈值确实很重要,那么您应该将其设置为100,000行从现在开始

thresh = i + 100000

重申我上面评论的内容,为什么不一次只提供一个结果集read_block(或read_one_results_set或其他什么),而不用担心计算行?