2016-05-12 1 views
6

Я пытаюсь написать dataframe к сжат GZIP CSV в питона панд, используя следующее:Применить сжатие GZIP в CSV в Python панд

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 под названием «Foo-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

+0

как @root уже сказал - он должен работать так же (с указанием 'compression = 'gzip''). Вам не нужно использовать модуль 'gzip' – MaxU

+0

[здесь] (http://stackoverflow.com/a/37012035/5741205) - это некоторые примеры __tested__. На самом деле я бы рекомендовал переключиться на HDF5 - это намного быстрее и удобнее! – MaxU

ответ

10

Использование df.to_csv() с аргументом ключевого слова compression='gzip' должно содержать архив gzip. Я тестировал его, используя те же аргументы ключевых слов, что и вы, и он сработал.

Возможно, вам потребуется обновить pandas, поскольку 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 

Напишите панды dataframe на диск, как разархивировать сжатый CSV

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

Чтение с диска

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