Python 使用文件字节访问 zip 文件并遍历每个文件以将它们保存到数据帧中返回未找到文件的错误

Posted

技术标签:

【中文标题】Python 使用文件字节访问 zip 文件并遍历每个文件以将它们保存到数据帧中返回未找到文件的错误【英文标题】:Python access a zip file using file bytes and loop over each file to save them into data frames is returning an error of file is not found 【发布时间】:2020-12-07 13:49:46 【问题描述】:

我正在调用一个 API,它会生成一个可能包含多个 CSV 文件的 zip 文件:

import zipfile
from io import BytesIO

api_url = res.json()['export_url']
new_res = requests.get(api_url, auth=(user, pass))
filebytes = BytesIO(new_res.content)
myzipfile = zipfile.ZipFile(filebytes)
a = myzipfile.extractall
for name in myzipfile.namelist():
    print(name)

我可以清楚地看到文件名,但无法将它们分别读入数据框:

for name in myzipfile.namelist():
    df = pd.read_csv(name)

错误是:

FileNotFoundError: [Errno 2] File data.csv does not exist: 'data.csv'

我试过了:

for name in myzipfile.printdir():
    print(name)

并以 csv 格式读取,但不起作用。

【问题讨论】:

【参考方案1】:

文件仍处于压缩状态 - 您不能像往常一样只读取包含的文件。 Zipfile 有自己的open 函数,用于读取包含的文件。然后,您可以使用 pandas 将数据读入数据框。

for name in myzipfile.namelist():
    with myzipfile.open(name) as myfile:
        df = pd.read_csv(myfile)

【讨论】:

知道如何提取文件大小吗? 看起来myfile.seek(0,2) 然后size = myfile.tell() 会给你python as detailed here 中任何文件/二进制对象的大小(以字节为单位)。我假设这适用于 zipfile 创建的文件对象,但我现在无法测试它。

以上是关于Python 使用文件字节访问 zip 文件并遍历每个文件以将它们保存到数据帧中返回未找到文件的错误的主要内容,如果未能解决你的问题,请参考以下文章

将文件压缩到内存并以字节python的形式读取整个存档

读取二进制文件并遍历每个字节

需要搜索目录并遍历 zip 文件并阅读每个 [重复]

压缩文件到字节 Python 3

Python 文件 IO 和 zipfile。尝试遍历文件夹中的所有文件,然后使用 Python 遍历相应文件中的文本

Python:从二进制文件而不是文件名打开 zip 文件