Python 熊猫能否在存档中读取和存档?

Python 熊猫能否在存档中读取和存档?,python,pandas,tarfile,Python,Pandas,Tarfile,我有一个归档文件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 = tar

我有一个归档文件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\u csv可能正试图将输入解释为文件名。如果将提取的文件包装在io.BytesIO中,我怀疑您应该能够让它像对待打开的文件句柄一样对待它

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

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

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

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

这应该起作用:

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

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

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

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

这应该起作用:

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

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

谢谢您的回答!失败需要一段时间,但它给出了TypeError:需要一个类似字节的对象,而不是“ExFileObject”,谢谢您的回答!失败需要一段时间,但它给出了TypeError:需要一个类似字节的对象,而不是“ExFileObject”