0

0

从Google Drive下载并解压ZIP文件至Colab Notebook

霞舞

霞舞

发布时间:2025-11-26 09:14:17

|

1020人浏览过

|

来源于php中文网

原创

从google drive下载并解压zip文件至colab notebook

本教程详细介绍了如何在Google Colab环境中,无需挂载Google Drive,从公共Google Drive链接下载并解压ZIP文件。文章分析了常见的`BadZipFile`错误原因,提供了使用`requests`库构建正确下载URL的方法,并重点推荐了更便捷、鲁棒的`gdown`库,以确保文件能够被正确识别和处理,从而实现可复现的数据集下载流程。

在数据科学和机器学习项目中,经常需要从外部源下载数据集。Google Drive因其便捷的共享功能,常被用作数据集的托管平台。然而,在Google Colaboratory (Colab) Notebook中直接从公共Google Drive链接下载并解压ZIP文件时,开发者可能会遇到一些挑战,特别是当不希望挂载个人Google Drive以保持环境的可复现性时。本文将深入探讨如何高效、正确地在Colab中完成这一任务。

一、理解Google Drive文件下载机制与常见问题

直接从Google Drive的共享链接(例如https://drive.google.com/drive/folders/... 或 https://drive.google.com/file/d/...)尝试下载文件,往往不会直接得到文件本身,而是会收到一个HTML页面。这是因为Google Drive在提供文件下载前,通常会经过一个中间页面,用于显示文件信息、病毒扫描警告(针对大文件)或权限验证。

当使用requests库或wget命令尝试下载这类链接时,如果接收到的内容是HTML而不是实际的ZIP文件二进制数据,那么尝试使用zipfile模块解压时就会抛出BadZipFile: File is not a zip file的错误。

诊断方法:检查Content-Type头部

在尝试解压前,检查HTTP响应的Content-Type头部是诊断此类问题的关键。如果Content-Type显示为text/html而不是application/zip,则说明下载到的并非ZIP文件。

import requests

file_id = '1fdFu5NGXe4rTLYKD5wOqk9dl-eJOefXo' # 替换为你的Google Drive文件ID
download_url = f'https://drive.google.com/uc?export=download&id={file_id}'
response = requests.get(download_url)
print(f"Content-Type: {response.headers.get('Content-Type')}")

如果输出显示Content-Type: text/html,则需要调整下载策略。

二、使用requests库下载并解压ZIP文件

要从Google Drive直接下载文件,需要构造一个特定的下载URL,通常格式为 https://drive.google.com/uc?export=download&id=FILE_ID。其中,FILE_ID是Google Drive文件中唯一的标识符,可以从文件的共享链接中提取(例如,https://drive.google.com/file/d/FILE_ID/view)。

步骤:

  1. 获取文件ID: 从Google Drive文件的共享链接中提取FILE_ID。
  2. 构造下载URL: 使用https://drive.google.com/uc?export=download&id=FILE_ID格式。
  3. 发送HTTP请求: 使用requests.get()获取文件内容。
  4. 处理大文件下载: 对于超过一定大小的文件,Google Drive可能会显示病毒扫描警告。这会导致首次请求返回一个包含“Download anyway”按钮的HTML页面。为了绕过此页面,通常需要跟随重定向或在请求中加入特定的cookie
  5. 解压ZIP文件: 将下载的二进制内容传递给zipfile模块进行解压。

以下是一个完整的示例代码:

import requests
import io
import zipfile
import os

# 替换为你的Google Drive文件ID
file_id = '1fdFu5NGXe4rTLYKD5wOqk9dl-eJOefXo' # 示例ID,请替换为实际ZIP文件的ID
download_url = f'https://drive.google.com/uc?export=download&id={file_id}'

# 目标保存路径
output_path = '/content/downloaded_zip.zip'
extraction_dir = '/content/extracted_data/'

print(f"尝试从 {download_url} 下载文件...")

# 处理Google Drive大文件下载时的病毒扫描警告
# Google Drive对于大文件可能会返回一个警告页面,需要模拟点击“下载”
def download_file_from_google_drive(id, destination):
    URL = "https://drive.google.com/uc?export=download"

    session = requests.Session()

    response = session.get(URL, params = { 'id' : id }, stream = True)
    token = get_confirm_token(response)

    if token:
        params = { 'id' : id, 'confirm' : token }
        response = session.get(URL, params = params, stream = True)

    save_response_content(response, destination)    

def get_confirm_token(response):
    for key, value in response.cookies.items():
        if key.startswith('download_warning'):
            return value
    return None

def save_response_content(response, destination):
    CHUNK_SIZE = 32768
    with open(destination, "wb") as f:
        for chunk in response.iter_content(CHUNK_SIZE):
            if chunk: # filter out keep-alive new chunks
                f.write(chunk)

# 执行下载
try:
    download_file_from_google_drive(file_id, output_path)
    print(f"文件已下载到: {output_path}")

    # 检查下载的文件是否是有效的ZIP文件
    if not os.path.exists(output_path) or os.path.getsize(output_path) == 0:
        print("错误:下载的文件为空或不存在。请检查文件ID和权限。")
    else:
        # 解压ZIP文件
        os.makedirs(extraction_dir, exist_ok=True)
        with zipfile.ZipFile(output_path, 'r') as zip_ref:
            zip_ref.extractall(extraction_dir)
        print(f"ZIP文件已成功解压到: {extraction_dir}")

except Exception as e:
    print(f"下载或解压过程中发生错误: {e}")
    print("请确认文件ID是否正确,以及文件是否设置为公开访问。")

注意事项:

  • file_id必须是正确的Google Drive文件ID。
  • 上述download_file_from_google_drive函数包含了处理Google Drive病毒扫描警告的逻辑,对于大文件下载尤为重要。
  • 请确保目标ZIP文件已设置为“任何人都可以查看”或具有适当的共享权限。

三、推荐方案:利用gdown库简化流程

gdown是一个专门用于从Google Drive下载文件的Python库,它封装了处理Google Drive下载链接、病毒扫描警告等复杂逻辑,使得下载过程更加简洁和鲁棒。对于在Colab中进行数据下载,gdown是高度推荐的工具

步骤:

  1. 安装gdown: 在Colab Notebook中运行pip install gdown。
  2. 使用gdown下载: 直接调用gdown.download()函数,传入文件ID和目标路径。
  3. 解压ZIP文件: 使用zipfile模块解压下载的文件。
# 1. 安装 gdown 库
!pip install gdown -q

import gdown
import zipfile
import os

# 替换为你的Google Drive文件ID
file_id = '1fdFu5NGXe4rTLYKD5wOqk9dl-eJOefXo' # 示例ID,请替换为实际ZIP文件的ID
output_path = '/content/downloaded_zip.zip'
extraction_dir = '/content/extracted_data/'

print(f"使用 gdown 从 Google Drive 下载文件 ID: {file_id}")

try:
    # 2. 使用 gdown 下载文件
    # quiet=False 会显示下载进度
    gdown.download(id=file_id, output=output_path, quiet=False)
    print(f"文件已下载到: {output_path}")

    # 检查下载的文件是否是有效的ZIP文件
    if not os.path.exists(output_path) or os.path.getsize(output_path) == 0:
        print("错误:下载的文件为空或不存在。请检查文件ID和权限。")
    else:
        # 3. 解压ZIP文件
        os.makedirs(extraction_dir, exist_ok=True)
        with zipfile.ZipFile(output_path, 'r') as zip_ref:
            zip_ref.extractall(extraction_dir)
        print(f"ZIP文件已成功解压到: {extraction_dir}")

except Exception as e:
    print(f"下载或解压过程中发生错误: {e}")
    print("请确认文件ID是否正确,以及文件是否设置为公开访问。")

# 验证解压内容 (可选)
# print("\n解压后的文件列表:")
# for root, dirs, files in os.walk(extraction_dir):
#     for name in files:
#         print(os.path.join(root, name))

gdown库的优点在于它能够自动处理Google Drive的各种下载重定向和警告,使得代码更加简洁和健壮。

四、注意事项与常见问题

  1. 文件ID的准确性: 确保使用的file_id是目标ZIP文件的正确ID。错误的ID会导致下载失败或下载到错误的文件。
  2. 文件公开权限: 目标Google Drive文件必须设置为“任何人都可以查看”或具有适当的共享权限,否则即使有了正确的下载URL,也无法访问。
  3. 验证下载内容: 在解压之前,始终建议检查下载文件的大小或Content-Type,以确保确实下载到了ZIP文件而不是HTML页面或其他错误响应。
  4. wget命令: 虽然本文主要推荐Python库,但如果偏好命令行工具,wget也可以用于下载。同样需要使用正确的下载URL,并可能需要额外的参数来处理重定向和证书问题,例如:
    !wget --no-check-certificate -O '/content/file.zip' 'https://drive.google.com/uc?export=download&id=YOUR_FILE_ID'

    但wget在处理Google Drive的大文件病毒扫描警告时可能不如gdown灵活。

五、总结

在Google Colab中从公共Google Drive下载并解压ZIP文件,关键在于理解Google Drive的下载机制,并构造正确的下载URL。对于大多数场景,推荐使用gdown库,它提供了一种简洁而强大的解决方案,能够自动处理Google Drive下载的复杂性。如果需要更精细的控制,requests库配合正确的逻辑也可以实现。无论选择哪种方法,始终要确保文件ID的正确性以及文件的公共可访问性,以保证数据下载流程的顺畅和可复现。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

373

2023.10.09

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

436

2024.12.20

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

803

2024.12.23

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

370

2025.07.23

cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6500

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

368

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

446

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

97

2025.08.19

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 4.9万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号