2014-09-22 14 views
7

Tôi đang tạo ra một số lượng file csv động, sử dụng đoạn mã sau:Làm thế nào để nén tệp csv thành lưu trữ zip trực tiếp?

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) 

Để tiết kiệm không gian, tôi muốn nén chúng.
Sử dụng các module gzip là khá dễ dàng:

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

Nhưng tôi muốn các tập tin ở định dạng 'zip'.

Tôi đã thử mô-đun zipfile, nhưng tôi không thể ghi trực tiếp tệp vào lưu trữ zip.

Thay vào đó, tôi phải ghi tệp csv vào đĩa, nén chúng vào tệp zip bằng mã sau và sau đó xóa tệp csv.

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

Làm cách nào để ghi tệp csv trực tiếp vào zip nén tương tự như gzip?

+0

@ J.F.Sebastian cảm ơn nhận xét. đã cập nhật –

Trả lời

7

Sử dụng các đối tượng cStringIO.StringIO để bắt chước một file:

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

tuyệt vời. cảm ơn cho câu trả lời nhanh chóng. nó được thực hiện với ít sửa đổi. Vui lòng kiểm tra câu trả lời của tôi. –

+1

Trong Python 3, điều này đã chuyển sang [io.StringIO] (https://docs.python.org/3.6/library/io.html#io.StringIO). – Teepeemm

1

Cảm ơn kroolik Nó thực hiện với sửa đổi chút.

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

lưu ý: 'StringIO()' tích lũy dữ liệu trong bộ nhớ. Nó không phải là rất phù hợp nếu không nén dữ liệu không thể phù hợp trong bộ nhớ. – jfs

+0

@ J.F.Sebastian thnks cho nhận xét. Bạn có thể đề xuất bất kỳ giải pháp thay thế nào tốt hơn không? –

+2

sử dụng bất kỳ định dạng nén nào hỗ trợ phát trực tuyến – jfs

Các vấn đề liên quan