2016-05-12 75 views
6

我想寫一個數據幀在Python大熊貓gzip壓縮的CSV,使用以下:應用GZIP壓縮在Python大熊貓一個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') 

這只是創建稱爲CSV「富-YYYYMMDD.csv .gz',而不是實際的gzip存檔。

我也嘗試添加此:

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

這也將失敗。有任何想法嗎?

+3

使用'很容易做到df.to_csv'與'compression ='g zip''爲我生成一個gzip存檔。我使用了與您相同的關鍵字參數。你使用什麼版本的熊貓?查看'pd .__ version__'的輸出來確定這一點。它看起來像gzip直到0.17.1才實現,但在早期版本中使用它不會產生錯誤。作爲@root已經說過了 - – root

+0

- 它應該像那樣工作(指定'compression ='gzip'')。你不需要使用'gzip'模塊 – MaxU

+0

[這裏](http://stackoverflow.com/a/37012035/5741205)是一些__tested__的例子。其實我會建議切換到HDF5 - 它更快,更方便! – MaxU

回答

10

使用df.to_csv()與關鍵字參數compression='gzip'應產生一個gzip存檔。我使用與您相同的關鍵字參數對其進行了測試,結果如此。

您可能需要升級熊貓,因爲gzip在版本0.17.1之前未實現,但試圖在先前版本中使用它不會引發錯誤,並且只會生成常規csv。您可以通過查看pd.__version__的輸出來確定當前版本的熊貓。

+0

真的很有幫助,謝謝。其他壓縮機制是否也支持? –

+0

@cᴏʟᴅsᴘᴇᴇᴅ閱讀[文檔](https://pandas.pydata。org/pandas-docs/stable/generated/pandas.DataFrame.to_csv.html) 如果您正在使用Jupyter筆記本,則只需鍵入'?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

documentation

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方法。

+0

感謝您的迴應!這也工作。 – user2752159

3

它與大熊貓

import pandas as pd 

一個大熊貓據幀到光盤作爲gunzip解壓縮CSV

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

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