2014-09-22 18 views
7

sto generando un certo numero di file CSV in modo dinamico, utilizzando il seguente codice:Come comprimere il file CSV direttamente nell'archivio 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) 

Per risparmiare spazio, voglio comprimerli.
Utilizzando il modulo gzip è abbastanza facile:

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

ma voglio che il file in formato 'zip'.

Ho provato il modulo zipfile, ma non riesco a scrivere direttamente i file nell'archivio zip.

Invece, devo scrivere il file csv su disco, comprimerli in un file zip usando il seguente codice, e quindi eliminare il file csv.

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

Come posso scrivere un file CSV direttamente su un zip compresso simile a gzip?

+0

@ J.F.Sebastian, grazie per il commento. aggiornato –

risposta

7

utilizzare l'oggetto cStringIO.StringIO di imitare un 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

cool. grazie per la risposta rapida. è fatto con poche modifiche Per favore controlla la mia risposta. –

+1

In Python 3, questo è stato spostato in [io.StringIO] (https://docs.python.org/3.6/library/io.html#io.StringIO). – Teepeemm

1

Grazie kroolik E 'fatto con poche modifiche.

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

nota: 'StringIO()' accumula i dati in memoria. Non è molto adatto se i dati non compressi non si adattano alla memoria. – jfs

+0

@ J.F.Sebastian thnks per il commento. Puoi suggerire un'alternativa migliore? –

+2

utilizza qualsiasi formato di compressione che supporti lo streaming – jfs

Problemi correlati