web-dev-qa-db-fra.com

Appliquer une compression GZIP à un fichier CSV dans les pandas Python

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? 

16
user2752159

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__.

22
root

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')
15
Ioannis Nasios

De documentation

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.

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