繁体   English   中英

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

[英]Efficiently rewriting lines in a large text file with 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中获得字处理器的“插入”功能而不将整个文档加载到内存中? 最终文件大于我所有可用的内存。

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

这样,您的记录将是完整的(长度),并且您不必在文件中四处走动。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM