使用torchvision的download_file_from_google_drive下载zip文件损坏如何解决
问题原因排查及解决方案
核心原因排查
- 首先排查解压代码的低级错误:你调用的类名拼写错误,
zipfile.Zipfile正确写法应为zipfile.ZipFile,大小写错误会直接抛出异常,优先确认这个问题。 - PyTorch自带的
download_file_from_google_drive接口存在已知缺陷:当谷歌云盘文件体积过大触发病毒扫描提示、或者文件需要下载确认时,接口会直接下载谷歌的提示页面HTML而非真实zip文件,你看到的文件大小和预期一致大概率是巧合,可通过以下方式验证:用文本编辑器打开下载的filename.zip,如果开头是<html>、<head>这类HTML标签,就说明下载内容不是压缩包。 - 排除前两个问题后,再确认传入的
file_id是否正确、对应云盘源文件本身是否损坏、下载过程中是否出现网络丢包导致字节异常。
修复方案
- 先验证下载文件合法性,运行以下代码查看文件头:
with open("filename.zip", "rb") as f: print(f.read(100))
合法zip文件的开头应为b'PK\x03\x04',如果不匹配说明下载内容错误。
- 替换PyTorch自带的下载接口,使用可处理谷歌云盘确认提示的自定义下载逻辑:
import requests from pathlib import Path def download_gdrive_file(file_id: str, save_path: str): base_url = "https://docs.google.com/uc?export=download" session = requests.Session() resp = session.get(base_url, params={"id": file_id}, stream=True) # 提取下载确认token confirm_token = None for k, v in resp.cookies.items(): if k.startswith("download_warning"): confirm_token = v break if confirm_token: resp = session.get(base_url, params={"id": file_id, "confirm": confirm_token}, stream=True) # 写入文件 with open(save_path, "wb") as f: for chunk in resp.iter_content(chunk_size=32*1024): if chunk: f.write(chunk) # 调用示例 download_gdrive_file(file_id=file_id, save_path=str(Path(".") / "filename.zip"))
- 修复解压代码的拼写错误,补充合法性校验:
import zipfile from pathlib import Path from typing import Optional # 此处替换为你自己的压缩类型映射配置 _ZIP_COMPRESSION_MAP = { "deflated": zipfile.ZIP_DEFLATED, "stored": zipfile.ZIP_STORED } def _extract_zip(from_path: str, to_path: str, compression: Optional[str] = None) -> None: # 修正类名大小写错误 with zipfile.ZipFile( from_path, "r", compression=_ZIP_COMPRESSION_MAP[compression] if compression else zipfile.ZIP_STORED) as zip_ref: zip_ref.extractall(to_path) zip_path = Path(".") / "filename.zip" # 先校验是否是合法zip文件再解压 if zip_path.exists() and zipfile.is_zipfile(zip_path): _extract_zip(str(zip_path), str(Path("."))) else: print("下载的文件不是合法zip压缩包")
内容的提问来源于stack exchange,提问作者tealy
相关产品推荐
相关产品推荐

