2015-04-23 79 views
1

我使用的是以下生成的行中的存儲高效的方式通過給定的CSV文件行遍歷行:中讀取壓縮/放氣(CSV)文件由線

def csvreader(file): 
    with open(file, 'rb') as csvfile: 
     reader = csv.reader(csvfile, delimiter=',',quotechar='"') 
     for row in reader: 
      yield row` 

這工作完全和我我能夠非常好地處理非常大的文件。對於RAM有限的小型虛擬機實例,幾千兆字節的CSV文件似乎完全沒有問題。

但是,當文件變得太大時,磁盤空間就成了問題。 CSV文件通常看起來具有非常高的壓縮率,這使我可以將文件存儲爲未壓縮大小的一小部分,但在我可以使用上述代碼處理文件之前,我必須解壓縮/擴充文件,然後運行它通過我的腳本。

我的問題:有沒有什麼辦法建立一個高效的生成器來完成上述操作(給定一個文件,將CSV行作爲數組),但是通過膨脹文件的某些部分,直到達到換行符爲止,然後通過csv閱讀器運行它,而不必對整個文件進行壓縮/解壓縮?

非常感謝您的考慮!

+0

理想情況下,我很想有相反的解決方案。給定一個數組,以CSV兼容的方式對其進行編碼,然後解壓並附加到現有文件中。雖然我意識到這可能很難做到,也許會有某種方法來讀取壓縮文件的頭並使用該壓縮方案來壓縮給定的字符串? –

+1

最好的機會是將文件作爲'GzipFile'(https://docs.python.org/2/library/gzip.html)打開並測試內存消耗。請注意,壓縮對文件I/O有很大影響。 –

回答

1

使用gzip

只是with gzip.open(file, 'rb') as csvfile:取代with open(file, 'rb') as csvfile:,並在你的腳本的頂部添加import gzip嘗試。

this SO question for more

+0

乾杯!我會試試這個! –

1

如果from gzip import open,你不需要改變你的代碼!