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

使用torchvision的download_file_from_google_drive下载zip文件损坏如何解决

问题原因排查及解决方案

核心原因排查

  1. 首先排查解压代码的低级错误:你调用的类名拼写错误,zipfile.Zipfile正确写法应为zipfile.ZipFile,大小写错误会直接抛出异常,优先确认这个问题。
  2. PyTorch自带的download_file_from_google_drive接口存在已知缺陷:当谷歌云盘文件体积过大触发病毒扫描提示、或者文件需要下载确认时,接口会直接下载谷歌的提示页面HTML而非真实zip文件,你看到的文件大小和预期一致大概率是巧合,可通过以下方式验证:用文本编辑器打开下载的filename.zip,如果开头是<html>、<head>这类HTML标签,就说明下载内容不是压缩包。
  3. 排除前两个问题后,再确认传入的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:27:03