将GZIP压缩应用于Python Pandas中的CSV

Apply GZIP compression to a CSV in Python Pandas

我正在尝试使用以下内容将数据帧写入python pandas中的gzip压缩包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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='
'
)

这只是创建一个名为'foo-YYYYMMDD.csv.gz'的csv,而不是实际的gzip存档。

我也试过添加这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#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='
'
)

# Write above variable to gzip
 with gzip.open('foo-%s.csv.gz' % todaysdatestring, 'wb') as output:
   output.write(d)

哪个也失败了。 有任何想法吗?

  • 使用df.to_csvcompression='gzip'为我生成一个gzip存档。 我使用了与你相同的关键字参数。 您使用的是什么版本的熊猫? 请参阅pd.__version__的输出以确定此情况。 看起来gzip直到0.17.1才实现,但尝试在早期版本中使用它不会产生错误。
  • 这是一些经过测试的例子。 实际上我建议切换到HDF5 - 它更快更方便!
  • @root,那就是问题! 我从命令行运行easy_install --upgrade pandas并从16.1升级到18.1,从顶部开始的"#create csv with gzip compression"代码按预期工作。 我应该编辑/删除主帖以反映这一点吗?
  • 我会把我的评论写成答案,你可以接受。


使用df.to_csv()和关键字参数compression='gzip'应该生成一个gzip存档。 我使用与您相同的关键字参数对其进行了测试,并且它有效。

您可能需要升级pandas,因为gzip直到版本0.17.1才会实现,但尝试在先前版本上使用它不会引发错误,只会生成常规csv。 您可以通过查看pd.__version__的输出来确定当前版本的pandas。

  • @c+及其???? 如果您正在使用Jupyter笔记本,请阅读文档,只需键入?df.to_csv即可
  • 只是想添加一个记录的限制,只有当.to_csv()的第一个参数是文件名时,compression=gzip才能工作。 如果它是一个文件对象,它将无法工作。
  • 注意:由于连接gunzip会产生另一个有效的gunzip,你可以重复执行df.to_csv(filename, compression='gzip', mode='a')将数据帧组合成一个大的gunzipped文件。 如果您的数据不适合内存,则非常有用。


用熊猫很容易完成

1
import pandas as pd

将pandas数据帧写入gunzip压缩csv

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

从光盘中读取

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


从文档

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

pandas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import gzip


content = df.to_csv(
      sep='|',
      header=True,
      index=False,
      quoting=csv.QUOTE_ALL,
      quotechar='"',
      doublequote=True,
      line_terminator='
'
)

with gzip.open('foo-%s.csv.gz' % todaysdatestring, 'wb') as f:
    f.write(content)

这里的诀窍是to_csv输出文本,如果你没有传递文件名。 然后,您只需将该文本重定向到gzipwrite方法。


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