web-dev-qa-db-ja.com

Python PandasでCSVにGZIP圧縮を適用する

以下を使用して、python pandasでgzip圧縮されたcsvにデータフレームを書き込もうとしています。

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

これは、実際のgzipアーカイブではなく、 'foo-YYYYMMDD.csv.gz'という名前のcsvを作成するだけです。

私もこれを追加しようとしました:

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

同様に失敗します。何か案は?

22
user2752159

df.to_csv()をキーワード引数compression='gzip'とともに使用すると、gzipアーカイブが生成されます。私はあなたと同じキーワード引数を使用してテストしましたが、うまくいきました。

Gzipはバージョン0.17.1まで実装されていなかったため、パンダをアップグレードする必要がありますが、以前のバージョンでそれを使用しようとしてもエラーは発生せず、通常のcsvが生成されます。 pd.__version__の出力を見ると、pandasの現在のバージョンを確認できます。

34
root

パンダでとても簡単にできます

import pandas as pd

書き込み a pandas gunzip圧縮csvとしてディスクへのデータフレーム

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

読み取りディスクから

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

ドキュメント から

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

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)

ここでのトリックはto_csvファイル名を渡さない場合、テキストを出力します。次に、そのテキストをgzipwriteメソッドにリダイレクトします。

8
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