2014-09-22 427 views
7

我產生了許多的CSV文件動態,使用下面的代碼:如何直接將csv文件壓縮成zip壓縮文件?

import csv 
fieldnames = ['foo1', 'foo2', 'foo3', 'foo4'] 
with open(csvfilepath, 'wb') as csvfile: 
    csvwrite = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames) 
    csvwrite.writeheader() 
    for row in data: 
     csvwrite.writerow(row) 

爲了節省空間,我想壓縮它們。
使用gzip模塊是很容易的:

with gzip.open("foo.gz", "w") as csvfile : 
    csvwrite = csv.DictWriter(csvfile, delimiter=',', fieldnames=fieldnames) 
    csvwrite.writeheader() 
    for row in data: 
     csvwrite.writerow(row) 

但我想在「拉鍊」格式文件。

我嘗試了zipfile模塊,但我無法直接將文件寫入zip壓縮文件。

相反,我必須將csv文件寫入磁盤,使用以下代碼將它們壓縮爲zip文件,然後刪除csv文件。

with ZipFile(zipfilepath, 'w') as zipfile: 
    zipfile.write(csvfilepath, csvfilename, ZIP_DEFLATED) 

如何將csv文件直接寫入類似於gzip的壓縮zip?

+0

@ J.F.Sebastian感謝您的評論。更新了 – 2014-11-16 03:47:16

回答

7

使用cStringIO.StringIO對象模仿文件:

with ZipFile(your_zip_file, 'w', ZIP_DEFLATED) as zip_file: 
    string_buffer = StringIO() 
    writer = csv.writer(string_buffer) 

    # Write data using the writer object. 

    zip_file.writestr(filename + '.csv', string_buffer.getvalue()) 
+0

酷。感謝您的快速回答。它完成了很少的修改。請檢查我的答案。 – 2014-09-22 10:36:48

+1

在Python 3中,這已經轉移到[io.StringIO](https://docs.python.org/3.6/library/io.html#io.StringIO)。 – Teepeemm 2017-09-05 12:58:17

1

感謝kroolik 它幾乎不做修改完成。

with ZipFile(your_zip_file, 'w', ZIP_DEFLATED) as zip_file: 
    string_buffer = StringIO() 
    csvwriter = csv.DictWriter(string_buffer, delimiter=',', fieldnames=fieldnames) 
    csvwrite.writeheader() 
    for row in cdrdata: 
     csvwrite.writerow(row) 
    zip_file.writestr(filename + '.csv', string_buffer.getvalue()) 
+2

注意:'StringIO()'將數據累積在內存中。如果未壓縮的數據不適合內存,它不是很合適。 – jfs 2014-09-22 11:32:20

+0

@ J.F.Sebastian要求置評。你能否提出更好的選擇? – 2014-10-06 06:15:02

+2

使用任何支持流式傳輸的壓縮格式 – jfs 2014-10-06 10:58:57