J'essaie d'écrire un cadre de données sur un CSV gzippé avec des pandas python, en utilisant les éléments suivants:
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')
Cela crée simplement un csv appelé 'foo-YYYYMMDD.csv.gz', pas une archive gzip réelle.
J'ai aussi essayé d'ajouter ceci:
#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)
Ce qui échoue aussi. Des idées?
L'utilisation de df.to_csv()
avec le mot clé argument compression='gzip'
devrait générer une archive gzip. Je l'ai testé en utilisant les mêmes arguments de mots clés que vous et cela a fonctionné.
Vous devrez peut-être mettre à niveau les pandas, car gzip n’a été implémenté que jusqu’à la version 0.17.1, mais essayer de l’utiliser sur des versions antérieures ne générera pas d’erreur, mais produira simplement un csv standard. Vous pouvez déterminer votre version actuelle des pandas en consultant la sortie de pd.__version__
.
Cela se fait très facilement avec des pandas
import pandas as pd
Écrire un fichier de données de pandas sur un disque au format CSV compressé
df.to_csv('dfsavename.csv.gz', compression='gzip')
Lecture à partir du disque
df = pd.read_csv('dfsavename.csv.gz', compression='gzip')
import gzip
content = "Lots of content here"
with gzip.open('file.txt.gz', 'wb') as f:
f.write(content)
avec 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)
L'astuce ici est que to_csv
génère du texte si vous ne lui transmettez pas un nom de fichier. Ensuite, il vous suffit de rediriger ce texte vers la méthode gzip
de write
.
with gzip.open('foo-%s.csv.gz' % todaysdatestring, 'wb') as f:
f.write(df.to_csv(sep='|', index=False, quoting=csv.QUOTE_ALL))