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" 参数的条目。
我有一个存档文件 (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" 参数的条目。