You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从在线ZIP读取WGIData.csv生成Pandas DataFrame时遇BadZipFile错误

解决BadZipFile错误:从在线ZIP读取WGI CSV到Pandas DataFrame

看起来你遇到的问题主要来自两个方面:HTTP响应处理不当,以及ZipFile API的错误使用。咱们一步步来修复:

问题分析

  1. 语法错误:你的导入语句格式有误,import pandas as pd from urllib.request import urlopen会触发语法报错,模块导入需要分开写。
  2. ZIP读取逻辑错误:直接把urlopen返回的HTTP响应对象传给ZipFile可能有问题——部分服务器会对HTTP请求做重定向(比如原链接会跳转到HTTPS),或者响应没有被正确解析为字节流。
  3. ZipFile方法误用:你调用self.zip.extractall(self.myzip)完全错误,extractall是ZipFile实例的方法,参数应该是解压路径,而非把ZipFile对象传入;后续你试图用extractall的返回值(实际是None)读取CSV,这显然行不通。

修复后的代码

下面提供两种可行的实现方式,你可以根据需求选择:

方式1:内存中直接读取(无需保存本地文件)

这种方式更高效,不需要把ZIP文件存到硬盘:

import pandas as pd
from urllib.request import urlopen
from zipfile import ZipFile

class Get_Data():
    def Return_csv_from_zip(self, url):
        # 打开URL并读取为字节流
        with urlopen(url) as zip_response:
            # 用ZipFile处理字节流
            with ZipFile(zip_response) as myzip:
                # 可选:查看ZIP内的所有文件,确认目标文件名称
                print("ZIP内的文件列表:", myzip.namelist())
                # 直接打开ZIP内的目标CSV文件并读取为DataFrame
                with myzip.open('WGIData.csv') as csv_file:
                    df = pd.read_csv(csv_file)
        return df

url = 'http://databank.worldbank.org/data/download/WGI_csv.zip'
data = Get_Data()
df = data.Return_csv_from_zip(url)
print(df.head())

方式2:先下载ZIP到本地再读取

如果需要保留ZIP文件,或者调试时要查看解压后的文件,可以用这种方式:

import pandas as pd
from urllib.request import urlretrieve
import zipfile
import os

class Get_Data():
    def Return_csv_from_zip(self, url, save_path='./wgi_data.zip'):
        # 下载ZIP文件到本地
        urlretrieve(url, save_path)
        # 解压ZIP文件到指定文件夹
        with zipfile.ZipFile(save_path, 'r') as myzip:
            myzip.extractall('./wgi_data')
        # 读取解压后的CSV文件
        df = pd.read_csv('./wgi_data/WGIData.csv')
        # 可选:删除临时文件和文件夹(如果不需要保留)
        # os.remove(save_path)
        # import shutil; shutil.rmtree('./wgi_data')
        return df

url = 'http://databank.worldbank.org/data/download/WGI_csv.zip'
data = Get_Data()
df = data.Return_csv_from_zip(url)
print(df.head())

额外提示

  • 如果仍然遇到BadZipFile错误,可能是网络问题导致下载的文件不完整,可以手动下载ZIP文件确认是否能正常打开;
  • 尽量使用with语句管理文件/响应对象,它会自动关闭资源,避免内存泄漏;
  • 调用myzip.namelist()可以查看ZIP内的所有文件名称,确保你要读取的文件名称正确(比如是否存在大小写差异)。

内容的提问来源于stack exchange,提问作者Vikas Gautam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:41:06