2015-04-25 58 views
2

文件目前,我有以下的CSV作家類:壓縮串並追加到上飛

class csvwriter(): 
    writer = None 
    writehandler = None 
    @classmethod 
    def open(cls,file): 
     cls.writehandler = open(file,'wb') 
     cls.writer = csv.writer(cls.writehandler, delimiter=',',quotechar='"', quoting=csv.QUOTE_NONNUMERIC) 

    @classmethod 
    def write(cls,arr): 
     cls.writer.writerow(arr) 

    @classmethod 
    def close(cls): 
     cls.writehandler.close() 

它可以產生正確的CSV文件,而不必在內存中的全陣列存儲在一個單一的時間。

但是,通過使用此代碼創建的文件可能非常大,所以我正在尋找壓縮它們,而不是將它們編碼爲未壓縮。 (爲了節省磁盤使用量)。我無法將文件有效地存儲在內存中,因爲我期望20GB以上的文件成爲常規文件。

生成文件的收件人通常不是他們PC的系統管理員,也不是他們都使用linux,所以我受限於我可以用於此任務的算法類型。優選地,該解決方案將使用在Windows,OSX和任何Linux發行版中本地可讀(不需要可執行程序)的壓縮方案。

我發現gzip在Python中提供了一個非常方便的接口,但是在windows中讀取gzip文件似乎相當麻煩。理想情況下,我會將它們放在一個zip存檔中,但zip存檔不允許您將數據附加到存檔中已存在的文件,然後強制我將整個文件存儲在內存中,或者將數據寫入幾個較小的文件中,這樣我就可以將其存儲在內存中。

我的問題:有沒有一種解決方案可以從兩全其美中受益?在終端用戶的機器上廣泛使用工具來讀取目標格式,並且能夠追加,而不是一次寫入整個文件?

在此先感謝您的考慮!

+0

爲什麼你認爲你曾經將所有的數據存儲在內存中來寫它?也沒有什麼意義可以用班級來做你正在做的事 –

+0

Hi Padraic, 關於班級的觀點已經夠公平的了。 我注意到我的代碼中偶然包含了gzip.open函數,我打算給出沒有壓縮的樸素版本。 Gzip可用,但非Linux用戶難以解壓縮(需要可執行文件,我的最終用戶可能不一定有權訪問)。 –

+0

我發現了以下博文 - http://swl10.blogspot.nl/2012/12/writing-stream-to-zipfile-in-python.html - 我會嘗試看看這是否是一條成功的路徑跟隨。 –

回答

2

gzlog可能會提供您正在尋找的功能。它可以將短字符串有效地附加到gzip文件,該短文件用於將短消息附加到長日誌中的應用程序。

+0

嗨馬克,感謝您的建議!我正在嘗試壓縮可能在windows計算機上工作並且沒有管理員權限的最終用戶安裝軟件的文件。出於這個原因,我不認爲gzip會是一個好主意,但如果我錯了,請糾正我! –

+1

您可以使用相同的技術追加到單個條目的zip文件。zip和gzip都使用deflate壓縮數據格式。 –