【问题标题】:Can I append to a compressed stream with pandas?我可以用熊猫附加到压缩流吗?
【发布时间】:2016-12-03 22:49:27
【问题描述】:

我知道通过将 compression='gzip' 参数传递给 pd.to_csv() 我可以将 DataFrame 保存到压缩的 CSV 文件中。

my_df.to_csv('my_file_name.csv', compression='gzip')

我也知道,如果我想追加一个 DataFrame 到现有 CSV 文件的末尾,我可以使用 mode='a',就像这样

my_df.to_csv('my_file_name.csv', mode='a', index=False)

但是如果我想在压缩的 CSV 文件的末尾附加一个 DataFrame 怎么办?这甚至可能吗?我试着这样做

my_df.to_csv('my_file_name.csv', mode='a', index=False, compression='gzip')

但是生成的 CSV 没有被压缩,尽管状态很好。


这个问题的动机是我使用 Pandas 处理一个大型 CSV 文件。我需要生成压缩的 CSV 输出,并将 CSV 文件分块处理到 DataFrame 中,这样我就不会遇到 MemoryError。因此,对我来说最合乎逻辑的做法是将每个输出 DataFrame 块一起附加到一个压缩的 zip 文件中。

我正在使用 Python 3.4 和 Pandas 0.16.1。

【问题讨论】:

标签: python csv pandas gzip


【解决方案1】:

最新答案:使用 pandas 1.2.4 为我工作

代码:

df.to_csv('test.csv', mode='a', compression='gzip')
new_df = pd.read_csv('test.csv', compression='gzip')

df.shape[0] # 1x
new_df.shape[0] # 2x

【讨论】:

    【解决方案2】:

    您可以执行以下操作

    import gzip
    
    with gzip.open('my_file_name.csv.gz', 'a') as compressed_file:
        df.to_csv(compressed_file, index=False)
    

    因为 pandas .to_csv 方法接受路径或类似文件的对象。

    【讨论】:

    • 不适用于 python 3.6.9、pandas 0.25.3:TypeError: memoryview: a bytes-like object is required, not 'str'
    • 这是如何解决的。我遇到了同样的错误。
    • compressed_file.write(df.to_csv().encode()) 现在可以使用了。
    【解决方案3】:

    上面的答案似乎不再起作用了。当df.to_csv() 没有传递路径或类似文件的对象时,它会将数据帧作为字符串返回。这可以编码并写入 gzip 文件。

    import gzip
    
    with gzip.open('my_file_name.csv.gz', 'a') as compressed_file:
        compressed_file.write(df.to_csv().encode())
    

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      • 2010-12-13
      • 2019-11-07
      相关资源
      最近更新 更多