2012-11-08 47 views
1

我試圖通過遍歷數千個數據庫記錄來生成大型數據文件(在GB中)。在文件的頂部是每個「特徵」的一行,在文件中出現後者。它們看起來像:使用這些屬性包含數據使用Python高效地重寫大文本文件中的行

@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

您不能在沒有複製的情況下將字符串插入文本文件,因此我認爲最好的方法是將功能和數據行保存在兩個列表中。在for循環中,將這些附加()添加到這些列表中,然後將兩個最終列表寫入文件。 – HYRY

回答

1

爲什麼沒有獲得所有功能及其數據類型的列表;首先列出它們。如果某個功能缺失,請將其替換爲已知值 - NULL似乎合適。

這樣你的記錄就會完整(長度),而且你不必跳過文件。

另一種方法是,寫兩個文件。一個包含所有的功能,其他所有的功能都包含在其中。生成兩個文件後,將特徵文件附加到數據文件的頂部。

FWIW,文字處理器將文件加載到內存中進行編輯;然後他們將整個文件寫出來。這就是爲什麼在文字處理器中無法加載大於可尋址/可用內存的文件;或者沒有作爲流讀取器實現的任何其他程序。

0

爲什麼不先在內存中創建輸出(例如作爲字典)並在所有數據已知之後將其寫入文件?

相關問題