[英]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.