webentwicklung-frage-antwort-db.com.de

Wenden Sie die GZIP-Komprimierung in Python Pandas auf eine CSV an

Ich versuche, ein Datenframe in eine gzipped csv in Python-Pandas zu schreiben, und zwar mit folgendem Befehl:

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')

Dadurch wird lediglich ein csv mit dem Namen 'foo-YYYYMMDD.csv.gz' erstellt, kein tatsächliches gzip-Archiv.

Ich habe auch versucht, Folgendes hinzuzufügen:

#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)

Was auch scheitert. Irgendwelche Ideen? 

16
user2752159

Wenn Sie df.to_csv() mit dem Schlüsselwortargument compression='gzip' verwenden, sollte ein gzip-Archiv erstellt werden. Ich habe es mit den gleichen Schlüsselwortargumenten wie Sie getestet, und es hat funktioniert.

Sie müssen möglicherweise Pandas aktualisieren, da gzip erst ab Version 0.17.1 implementiert wurde. Wenn Sie es jedoch in früheren Versionen verwenden, wird kein Fehler ausgegeben, sondern es wird lediglich eine reguläre csv-Datei erzeugt. Sie können Ihre aktuelle Version von Pandas ermitteln, indem Sie die Ausgabe von pd.__version__ betrachten.

22
root

Mit Pandas geht das sehr leicht

import pandas as pd

Schreiben Sie einen Pandas-Datenrahmen auf eine als gunzip komprimierte CSV-Datei

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

Lesen von CD

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

Aus Dokumentation

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

mit 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)

Der Trick dabei ist, dass to_csv Text ausgibt, wenn Sie ihm keinen Dateinamen übergeben. Dann leiten Sie diesen Text einfach zur gzip-Methode von write um.

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