我正在尝试通过迭代数千个数据库记录来生成大型数据文件(在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 中获取字处理器的“插入”功能,而不用将整个文档加载到内存中?最终文件大于我所有可用内存。
答案 0 :(得分:1)
为什么不获得所有功能及其数据类型的列表;先列出它们。如果缺少某项功能,请将其替换为已知值 - NULL
似乎合适。
通过这种方式,您的记录将完整(详细),您无需跳过文件。
另一种方法是,写两个文件。一个包含所有功能,其他包含所有行。生成两个文件后,将要素文件附加到数据文件的顶部。
FWIW,文字处理器将文件加载到内存中进行编辑;然后他们写出整个文件。这就是为什么你不能在文字处理器中加载大于可寻址/可用内存的文件;或任何其他未实现为流阅读器的程序。
答案 1 :(得分:0)
为什么不首先在内存中构建输出(例如作为dict)并在知道所有数据后将其写入文件?