使用Python有效地重写大文本文件中的行

时间:2012-11-08 04:21:06

标签: python

我正在尝试通过迭代数千个数据库记录来生成大型数据文件(在GB中)。在文件的顶部是每个“功能”的一行,后面出现在文件中。他们看起来像:

@attribute 'Diameter' numeric
@attribute 'Length' real
@attribute 'Qty' integer

包含使用这些属性的数据的行如下所示:

{0 0.86, 1 0.98, 2 7}

但是,由于我的数据是稀疏数据,因此我的数据库中的每条记录可能没有每个属性,而且我不知道完整的功能集是什么。理论上,我可以迭代我的数据库记录两次,第一次累积功能集,然后第二次输出我的记录,但我正在尝试找到一种更有效的方法。

我想尝试类似以下伪代码的方法:

fout = open('output.dat', 'w')
known_features = set()
for records in records:
    if record has unknown features:
        jump to top of file
        delete existing "@attribute" lines and write new lines
        jump to bottom of file
    fout.write(record)

这是跳转到/写入/跳回部分我不知道如何实现。你会怎么用Python做到这一点?

我尝试过类似的事情:

fout.seek(0)
for new_attribute in new_attributes:
    fout.write(attribute)
fout.seek(0, 2)

但是这会覆盖文件顶部的属性行数据行,而不是简单地插入从我指定的搜索位置开始的新行。

如何在Python 中获取字处理器的“插入”功能,而不用将整个文档加载到内存中?最终文件大于我所有可用内存。

2 个答案:

答案 0 :(得分:1)

为什么不获得所有功能及其数据类型的列表;先列出它们。如果缺少某项功能,请将其替换为已知值 - NULL似乎合适。

通过这种方式,您的记录将完整(详细),您无需跳过文件。

另一种方法是,写两个文件。一个包含所有功能,其他包含所有行。生成两个文件后,将要素文件附加到数据文件的顶部。

FWIW,文字处理器将文件加载到内存中进行编辑;然后他们写出整个文件。这就是为什么你不能在文字处理器中加载大于可寻址/可用内存的文件;或任何其他未实现为流阅读器的程序。

答案 1 :(得分:0)

为什么不首先在内存中构建输出(例如作为dict)并在知道所有数据后将其写入文件?