pandas 可以在存档中读取和存档吗?

Can pandas read and archive within an archive?

我有一个存档文件 (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

可以吗?

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

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

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

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

这应该有效:

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

有关详细信息,请参阅 read_csv() 文档中有关 "compression" 参数的条目。