【问题标题】:Can pandas read and archive within an archive?pandas 可以在存档中读取和存档吗?
【发布时间】:2020-02-21 20:46:03
【问题描述】:

我有一个存档文件 (archive.tar.gz),其中包含多个存档文件 (file.txt.gz)。

如果我首先将 .txt.gz 文件提取到一个文件夹中,然后我可以使用 pandas 直接打开它们:

import pandas as pd

df = pd.read_csv('file.txt.gz', sep='\t', encoding='utf-8')

但如果我使用 tarfile 库浏览存档,则它不起作用:

import pandas as pd
import tarfile

tar = tarfile.open("archive.tar.gz", "r:*")
csv_path = tar.getnames()[1]
df = pd.read_csv(tar.extractfile(csv_path), sep='\t', encoding='utf-8')

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

有可能吗?

【问题讨论】:

    标签: python pandas tarfile


    【解决方案1】:

    当您按文件名打开文件时,Pandas 将能够推断由于文件名上的 *.gz 扩展名,它是用 gzip 压缩的。

    当你向它传递一个文件对象时,你需要明确地告诉它压缩信息,以便它可以在读取文件时解压缩它。

    这应该可行:

    df = pd.read_csv(
        tar.extractfile(csv_path),
        compression='gzip',
        sep='\t',
        encoding='utf-8')
    

    有关更多详细信息,请参阅read_csv() 文档中有关“压缩”参数的条目。

    【讨论】:

      【解决方案2】:

      read_csv 可能试图将输入解释为文件名。如果您将提取的文件包装在io.BytesIO 中,我怀疑您应该能够让它像打开文件句柄一样对待它

      from io import BytesIO
      df = pd.read_csv(BytesIO(tar.extractfile(csv_path)), ...)
      

      【讨论】:

      • 感谢您的回答!它需要一段时间才能失败,但它给出“TypeError:需要一个类似字节的对象,而不是'ExFileObject'”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 1970-01-01
      相关资源
      最近更新 更多