Pandas read_csv在读取gzip文件时抛出ValueError



我正在尝试使用pandas.read_csv读取gzip文件,如下所示:

import pandas as pd
df = pd.read_csv("data.ZIP.gz", usecols=[*range(0, 39)], encoding="latin1", skipinitialspace=True)

但它抛出了一个错误:

ValueError:传递的标头名称与使用列不匹配

但是,如果我手动从gz文件中提取zip文件,那么read_csv如果能够读取数据而没有错误:

df = pd.read_csv("data.ZIP", usecols=[*range(0, 39)], encoding="latin1", skipinitialspace=True)

由于我必须阅读很多这样的文件,我不想手动提取它们。那么,我该如何修复这个错误呢?

您有两个压缩级别-gzipzip,但Panda只知道如何使用一个压缩级别。

您可以使用模块gzipzipfileio.BytesIO将其提取到内存中的file-like object


此处为最小工作代码

如果zip有很多文件,并且您想选择提取的文件,这可能会很有用

import pandas as pd
import gzip
import zipfile
import io
with gzip.open('data.csv.zip.gz') as f1:
data = f1.read()
file_like_object_1 = io.BytesIO(data)
with zipfile.ZipFile(file_like_object_1) as f2:
#print([x.filename for x in f2.filelist])  # list all filenames
#data = f2.read('data.csv')                # extract selected filename
#data = f2.read(f2.filelist[0])            # extract first file
data = f2.read(f2.filelist[0].filename)    # extract first file
file_like_object_2 = io.BytesIO(data)
df = pd.read_csv(file_like_object_2)
print(df)

但如果zip只有一个文件,那么您可以使用read_csv来提取它——它需要添加选项compression='zip',因为file-like object没有文件名,而read_csv不能使用文件名的扩展名来识别压缩文件。

import pandas as pd
import gzip
import io
with gzip.open('data.csv.zip.gz') as f1:
data = f1.read()
file_like_object_1 = io.BytesIO(data)
df = pd.read_csv(file_like_object_1, compression='zip')
print(df)

使用gzip模块来解压缩所有文件,比如这个

您可以使用zipfile模块,例如:

import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
zip_ref.extractall(directory_to_extract_to)

相关内容

最新更新