我有一个包含大量 .gz 文件的 .zip 文件,我需要对其进行处理。我想打开.zip,我可以通过以下代码轻松完成:
zf = zipfile.ZipFile("file.zip", "r")
for gzfile in zf.filelist:
with gzip.GzipFile(fileobj=zf.open(gzfile.filename, "r"), mode="r") as f:
df = pd.read_csv(f, compression="gzip", sep=";")
但是,这会导致
NotImplementedError: That compression method is not supported
,这是由
zf.open(gzfile)
引起的。与此相关的现有 StackOverflow 票证并未解决此问题。
你遇到的错误是因为你试图在
gzip.GzipFile
中解压一个已经由
zipfile.ZipFile
打开的对象。
zipfile.ZipFile.open()
方法返回一个类似文件的对象,该对象代表压缩存档
内
的文件,但它本身并没有被解压缩。
为了解决这个问题,你需要首先从zip存档中 提取 .gz 文件,然后解压它。
以下是你可以如何做到的:
import zipfile
import gzip
import pandas as pd
import io
# 打开 zip 文件
with zipfile.ZipFile("file.zip", "r") as zf:
# 遍历 zip 文件中的每个 .gz 文件
for gzfile in zf.filelist:
# 提取 .gz 文件到内存中
with zf.open(gzfile.filename) as gzdata:
# 使用 io.BytesIO 将字节数据包装成类文件对象
with io.BytesIO(gzdata.read()) as gzfile:
# 打开 .gz 文件进行读取
with gzip.GzipFile(fileobj=gzfile, mode="rb") as f:
# 使用 pandas 读取 csv 数据
df = pd.read_csv(f, compression="gzip", sep=";")
# 对 DataFrame 进行处理
print(df.head())
这段代码执行以下操作:
-
打开 zip 文件:
使用
zipfile.ZipFile
打开 zip 文件。 - 遍历 .gz 文件: 迭代 zip 存档中的所有文件。
-
提取 .gz 文件:
使用
zf.open()
读取 .gz 文件的内容,并将其存储在内存中的io.BytesIO
对象中。 -
解压 .gz 文件:
使用
gzip.GzipFile
并将io.BytesIO
对象作为fileobj
传递给它来打开 .gz 文件。 -
读取 CSV 数据:
使用
pd.read_csv
读取解压后的 CSV 数据。
注意: 将整个 .gz 文件提取到内存中可能会消耗大量内存,特别是如果文件很大的话。如果你的 .zip 文件非常大,你可能需要考虑将 .gz 文件提取到磁盘上的临时文件中,然后再进行处理。
标签:python,zip,compression,gzip,python-zipfile From: 78812532