如何直接将CSV文件压缩成Zip归档文件?

18

我正在使用以下代码动态生成多个csv文件:

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)

但我希望文件以“zip”格式保存。

我尝试使用zipfile模块,但无法直接将文件写入zip归档文件。

相反,我必须先将csv文件写入磁盘,使用以下代码将它们压缩成zip文件,然后删除csv文件。

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

我该如何将CSV文件直接写入到一个类似于gzip的压缩zip文件中?


@J.F.Sebastian 感谢您的评论。已更新。 - zoo zope
哇,使用gzip真的很容易!但在Py3中,我必须使用以下代码将字符串转换为字节,然后才能开始使用csv.writer并将行写入csv_out_file = io.TextIOWrapper(outfile, encoding='utf-8', newline='', write_through=True) - nmz787
3个回答

16

使用 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())

很酷,感谢快速回答。只需进行少量修改即可完成。请检查我的答案。 - zoo zope
4
在Python 3中,这已经移到了io.StringIO - Teepeemm

4

感谢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())

5
注意:StringIO() 会在内存中累积数据。如果未压缩的数据无法放入内存,则不太适合使用。 - jfs
@J.F.Sebastian 感谢您的评论。您能提供更好的替代方案吗? - zoo zope
@J.F.Sebastian 谢谢,但我正在使用“zip”格式,因为我计划在Windows上使用此文件。是否有类似于zip的常用格式适用于Windows? - zoo zope
我知道 7z 在 Windows 上也可以使用,并且它支持许多格式。 - jfs

0

使用IOString来存储内存中的每个字节可能会消耗大量内存。

根据zipfile模块文档,在创建ZipFile对象后,所有单独的文件都必须被打开。像这样:

with ZipFile('spam.zip') as myzip:
    with myzip.open('eggs.txt') as myfile:
        print(myfile.read())

这个示例也可以用于write...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接