2014-09-22 305 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