从在线ZIP读取WGIData.csv生成Pandas DataFrame时遇BadZipFile错误
解决BadZipFile错误:从在线ZIP读取WGI CSV到Pandas DataFrame
看起来你遇到的问题主要来自两个方面:HTTP响应处理不当,以及ZipFile API的错误使用。咱们一步步来修复:
问题分析
- 语法错误:你的导入语句格式有误,
import pandas as pd from urllib.request import urlopen会触发语法报错,模块导入需要分开写。 - ZIP读取逻辑错误:直接把
urlopen返回的HTTP响应对象传给ZipFile可能有问题——部分服务器会对HTTP请求做重定向(比如原链接会跳转到HTTPS),或者响应没有被正确解析为字节流。 - 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
相关产品推荐
相关产品推荐

