2016-05-12 57 views
6

Sto cercando di scrivere un dataframe a un csv gzipped in panda pitone, utilizzando il seguente:applicare la compressione GZIP in un file CSV in Python Pandas

import pandas as pd 
import datetime 
import csv 
import gzip 

# Get data (with previous connection and script variables) 
df = pd.read_sql_query(script, conn) 

# Create today's date, to append to file 
todaysdatestring = str(datetime.datetime.today().strftime('%Y%m%d')) 
print todaysdatestring 

# Create csv with gzip compression 
df.to_csv('foo-%s.csv.gz' % todaysdatestring, 
     sep='|', 
     header=True, 
     index=False, 
     quoting=csv.QUOTE_ALL, 
     compression='gzip', 
     quotechar='"', 
     doublequote=True, 
     line_terminator='\n') 

Questo solo crea un csv chiamato 'foo-YYYYMMDD.csv .gz ', non un vero archivio gzip.

Ho anche provato ad aggiungere questo:

#Turn to_csv statement into a variable 
d = df.to_csv('foo-%s.csv.gz' % todaysdatestring, 
     sep='|', 
     header=True, 
     index=False, 
     quoting=csv.QUOTE_ALL, 
     compression='gzip', 
     quotechar='"', 
     doublequote=True, 
     line_terminator='\n') 

# Write above variable to gzip 
with gzip.open('foo-%s.csv.gz' % todaysdatestring, 'wb') as output: 
    output.write(d) 

che non riesce pure. Qualche idea?

+3

Usando ' df.to_csv' con 'compression = 'g zip'' produce un archivio gzip per me. Ho usato gli stessi argomenti per le parole chiave di te. Quale versione di panda come stai usando? Vedi l'output di 'pd .__ version__' per determinare questo. Sembra che gzip non sia stato implementato fino alla 0.17.1, ma provare a usarlo nelle versioni precedenti non produrrà un errore. – root

+0

come ha già detto @root - dovrebbe funzionare proprio così (specificando 'compression = 'gzip''). Non hai bisogno di usare il modulo 'gzip' – MaxU

+0

[qui] (http://stackoverflow.com/a/37012035/5741205) alcuni esempi __tested__. In realtà raccomanderei di passare a HDF5 - è molto più veloce e più conveniente! – MaxU

risposta

10

Utilizzare df.to_csv() con l'argomento della parola chiave compression='gzip' dovrebbe produrre un archivio gzip. L'ho provato usando gli stessi argomenti delle parole chiave come te, e ha funzionato.

Potrebbe essere necessario aggiornare i panda, poiché gzip non è stato implementato fino alla versione 0.17.1, ma provare a utilizzarlo su versioni precedenti non genera un errore e produce solo un csv regolare. È possibile determinare la versione corrente dei panda controllando l'output di pd.__version__.

+0

Davvero utile, grazie. Sono supportati anche altri meccanismi di compressione? –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Leggi la [documentazione] (https: //pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html) se stai lavorando su un notebook Jupyter puoi semplicemente digitare '? df.to_csv' – user32185

0
with gzip.open('foo-%s.csv.gz' % todaysdatestring, 'wb') as f: 
    f.write(df.to_csv(sep='|', index=False, quoting=csv.QUOTE_ALL)) 
5

Da documentation

import gzip 
content = "Lots of content here" 
with gzip.open('file.txt.gz', 'wb') as f: 
    f.write(content) 

con pandas

import gzip 


content = df.to_csv(
     sep='|', 
     header=True, 
     index=False, 
     quoting=csv.QUOTE_ALL, 
     quotechar='"', 
     doublequote=True, 
     line_terminator='\n') 

with gzip.open('foo-%s.csv.gz' % todaysdatestring, 'wb') as f: 
    f.write(content) 

Il trucco è che il testo to_csv uscite se non si passa un nome di file. Quindi devi semplicemente reindirizzare quel testo al metodo .

+0

Grazie per la risposta! Anche questo ha funzionato. – user2752159

3

E 'fatto molto facilmente con i panda

import pandas as pd 

Scrivere un panda dataframe a disco come gunzip compressa csv

df.to_csv('dfsavename.csv.gz', compression='gzip') 

Leggi dal disco

df = pd.read_csv('dfsavename.csv.gz', compression='gzip')