【问题标题】:Python pandas to_csv zip formatPython 熊猫 to_csv zip 格式
【发布时间】:2019-08-03 16:57:39
【问题描述】:

我在通过 to_csv 写入 zip 文件时遇到了一个特殊问题。

使用 GZIP:

df.to_csv(path_or_buf = 'sample.csv.gz', compression="gzip", index = None, sep = ",", header=True, encoding='utf-8-sig')

提供了一个名为“sample.csv.gz”的简洁 gzip 文件,在其中我得到了我的 csv 'sample.csv'

但是,使用 ZIP 时情况会发生变化

df.to_csv(path_or_buf = 'sample.csv.zip', compression="zip", index = None, sep = ",", header=True, encoding='utf-8-sig')

提供一个名为“sample.csv.zip”的 zip 文件,但其中的 csv 也已重命名为“sample.csv.zip”。 从文件中删除多余的“.zip”会返回 csv。

如何在没有此问题的情况下实施 zip 扩展? 我需要有 zip 文件作为我无法绕过的要求。 我在 Windows 10 机器上使用 python 2.7。

提前感谢您的帮助。

【问题讨论】:

标签: python pandas python-2.7


【解决方案1】:

从 1.0.0 版开始,在 pandas 中使用 dict 作为压缩选项非常简单:

filename = 'sample'
compression_options = dict(method='zip', archive_name=f'{filename}.csv')
df.to_csv(f'{filename}.zip', compression=compression_options, ...)

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html

【讨论】:

  • 如果有人还在听这里.. 我在哪里可以找到所有可能的压缩选项? IE。我可以在“方法”、“存档名称”之外使用的所有字典键名..
  • 从我发布的链接中引用 pandas:“如果压缩模式是 'infer' 并且 path_or_buf 是类似路径的,则从以下扩展名中检测压缩模式:'.gz'、'.bz2 '、'.zip' 或 '.xz'。(否则不压缩)。如果给定 dict 且 mode 是 {'zip'、'gzip'、'bz2'} 之一,或推断为上述之一,则其他条目作为附加压缩选项传递。”
  • 我可能没有问清楚.. 我明白了.. 但是当它说“附加压缩选项”时,我想知道所有选项。从示例中我知道有“方法”和“存档名称”选项。但是可传递给压缩引擎的选项的完整列表是什么?例如,在 zip 的 unix 命令行中,-j 选项的意思是“不要在压缩文件中包含完整路径”.. 但是对于“-j”等价物,compression_options 中的成员名称是什么?跨度>
  • @daBich - 我也有同样的问题。我深入研究了 Pandas 代码,除了关键的“方法”之外,压缩选项字典中的所有其他项目都作为 **kwargs 传递给适当的 Python 压缩构造函数。因此,由于 gzip.GzipFile 接受 compresslevel 作为参数,因此将 {"method":"gzip", "compresslevel":9} 作为压缩选项传递是有效的。使用标准的 Python 压缩库,因此请查找 gzip.GzipFile、bz2.BZ2File 和 zipfile.ZipFile 的文档,以查看它们采用的参数。相关源码在pandas/io/common.py中get_handle()
  • 谢谢@sql_knievel!您是否碰巧偶然发现了 -j 等效参数?如果是这样,那将值得一个答案..
【解决方案2】:

正如评论中链接的thread 所讨论的那样,ZIP 的类似目录的性质使得在不做很多假设或使to_csv 的论点复杂化的情况下很难做你想做的事

如果您的目标是将数据直接写入 ZIP 文件,那就是harder than you'd think

如果您可以暂时将数据写入文件系统,您可以使用 Python 的 zipfile 模块将该文件以您喜欢的名称放入 ZIP 中,然后删除该文件。


import zipfile
import os

df.to_csv('sample.csv',index=None,sep=",",header=True,encoding='utf-8-sig')

with zipfile.ZipFile('sample.zip', 'w') as zf:
    zf.write('sample.csv')
os.remove('sample.csv')

【讨论】:

    【解决方案3】:

    从 Pandas 1.0.0 开始,可以使用 to_csv() 设置压缩。

    一行示例:

    df.to_csv('sample.zip', compression={'method': 'zip', 'archive_name': 'sample.csv'})
    

    【讨论】:

      猜你喜欢
      • 2016-01-17
      • 2018-05-16
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多