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

从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 requestsfile_id = '1fdFu5NGXe4rTLYKD5wOqk9dl-eJOefXo' # 替换为你的Google Drive文件IDdownload_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)。

步骤:

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

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

import requestsimport ioimport zipfileimport os# 替换为你的Google Drive文件IDfile_id = '1fdFu5NGXe4rTLYKD5wOqk9dl-eJOefXo' # 示例ID,请替换为实际ZIP文件的IDdownload_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 Nonedef 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是高度推荐的工具

步骤:

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

# 1. 安装 gdown 库!pip install gdown -qimport gdownimport zipfileimport os# 替换为你的Google Drive文件IDfile_id = '1fdFu5NGXe4rTLYKD5wOqk9dl-eJOefXo' # 示例ID,请替换为实际ZIP文件的IDoutput_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的各种下载重定向和警告,使得代码更加简洁和健壮。

四、注意事项与常见问题

文件ID的准确性: 确保使用的file_id是目标ZIP文件的正确ID。错误的ID会导致下载失败或下载到错误的文件。文件公开权限: 目标Google Drive文件必须设置为“任何人都可以查看”或具有适当的共享权限,否则即使有了正确的下载URL,也无法访问。验证下载内容: 在解压之前,始终建议检查下载文件的大小或Content-Type,以确保确实下载到了ZIP文件而不是HTML页面或其他错误响应。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的正确性以及文件的公共可访问性,以保证数据下载流程的顺畅和可复现。

以上就是从Google Drive下载并解压ZIP文件至Colab Notebook的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1383003.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 00:43:39
下一篇 2025年12月15日 00:43:51

相关推荐

  • python中如何实现自动化操纵浏览器?

    Selenium库可用于Python中自动化操纵浏览器,支持Chrome、Firefox等,通过安装selenium包和对应驱动实现;示例包括打开百度、定位搜索框输入“Python”并提交;常用操作有元素定位、点击、输入、获取页面信息及等待机制;可通过ChromeOptions设置无头模式运行;尽管…

    好文分享 2025年12月15日
    000
  • 从HTML表单获取逗号分隔值:转换为NumPy数组并用于机器学习预测

    本教程详细讲解了如何处理从HTML表单获取的逗号分隔字符串,将其正确转换为NumPy数值数组,并解决机器学习模型预测时常见的数组形状错误。通过字符串解析、类型转换和数组重塑,确保输入数据符合模型要求,实现准确预测。 从HTML表单获取逗号分隔值的挑战与解决方案 在Web应用开发中,我们经常需要从用户…

    2025年12月15日
    000
  • python中self可以在函数中使用吗?

    在类的方法中使用self来引用当前实例对象,它必须作为方法的第一个参数,用于访问实例属性和方法。例如,定义Person类时,通过self.name存储名字,并在greet方法中用self.name读取该值输出问候语。调用p.greet()时Python自动传入self,无需手动传递。注意self是约…

    2025年12月15日
    000
  • 如何使用python实现图片处理?

    首先安装Pillow、OpenCV、numpy和matplotlib库;接着用Pillow进行图像打开、调整大小、转灰度、滤镜等基础操作;然后使用OpenCV读取图像,转灰度图并进行边缘检测;最后通过matplotlib显示结果或保存处理后的图像,注意颜色通道顺序差异。 用Python处理图片主要依…

    2025年12月15日
    000
  • Python 环境搭建从入门到进阶的完整流程

    首先安装Python官方解释器并添加至PATH,验证版本后使用venv创建虚拟环境隔离依赖,通过pip管理包并导出requirements.txt,推荐用VS Code或PyCharm开发,配合black、flake8等工具提升代码质量,科学计算项目可选Conda管理多环境与重型库。 选择并安装 P…

    2025年12月15日
    000
  • python中exec()函数如何执行表达式?

    exec()用于执行Python语句如赋值、函数定义等,不返回结果,适合动态执行代码块;而表达式求值应使用eval(),因exec()设计上不返回表达式值,存在安全风险需谨慎使用。 exec() 函数在 Python 中用于动态执行 Python 代码,但它不能直接执行表达式并返回结果。它主要用于执…

    2025年12月15日
    000
  • python中try except语句块怎么用?

    try except用于捕获异常防止程序崩溃;2. 可指定异常类型精准处理;3. else在无异常时执行,finally始终执行用于清理;4. as可获取异常信息便于调试;5. 应合理使用避免滥用。 在 Python 中,try except 语句块用于捕获和处理程序运行时可能出现的异常,避免程序因…

    2025年12月15日
    000
  • python实例如何访问局部变量?

    局部变量定义在函数内,只能内部访问;2. 可通过返回值、闭包或locals()间接获取;3. 直接外部访问不可行,遵循作用域规则。 在 Python 中,局部变量是定义在函数内部的变量,通常只能在该函数内部访问。直接从函数外部访问局部变量是不允许的,但可以通过一些方法间接实现访问。 1. 使用 lo…

    2025年12月15日
    000
  • Python AssertionError 断言错误详解

    AssertionError是Python中用于调试的内置异常,当assert语句条件为False时触发,语法为assert condition, message;常用于检查函数参数、中间状态或测试结果,如calculate_discount中验证价格非负;它继承自Exception,但仅适用于开发…

    2025年12月15日
    000
  • 如何使用hex()在python中转换进制?

    hex()函数将整数转为十六进制字符串,返回值以’0x’开头,如hex(255)输出’0xff’;可通过切片[2:]去除前缀,或使用f”{num:x}”获取小写、f”{num:X}”获取大写形式;支持负数…

    2025年12月15日
    000
  • 如何在python django框架里搭建环境?

    首先配置Python环境并创建虚拟环境,然后安装Django并初始化项目。具体步骤为:安装Python 3.8+,使用venv创建隔离环境,激活后通过pip install django安装框架,再用django-admin startproject创建项目,运行runserver启动服务,最后生成…

    2025年12月15日
    000
  • python中_getitem_如何使用?

    getitem 是 Python 中用于实现对象索引访问的特殊方法,定义后可使实例支持方括号语法。当使用 obj[key] 时,Python 会调用 obj.__getitem__(key),从而自定义取值逻辑。例如,可通过该方法让类模拟列表或字典行为。在列表场景中,可返回内部列表指定索引的元素;若…

    2025年12月15日
    000
  • Python中Collections模块数据类型如何使用?

    Collections模块提供高效容器:Counter统计频次,defaultdict自动初始化,OrderedDict保持顺序,deque支持双端操作,提升代码简洁性与性能。 Python 的 Collections 模块提供了比内置数据类型更高级、更灵活的容器类型,能够简化特定场景下的代码逻辑。…

    2025年12月15日
    000
  • python namedtuple数据类哪个运行快

    namedtuple运行更快、内存更小,适合高频创建和只读场景;dataclass功能丰富但稍慢,适合复杂逻辑。 在 Python 中,namedtuple 和 dataclass 都可以用来定义轻量级的数据结构,但它们的运行效率有所不同。通常情况下,namedtuple 运行更快,内存占用更小,因…

    2025年12月15日
    000
  • Mac M1 芯片安装 Python 的注意事项

    在Mac M1芯片上安装Python需确保使用原生ARM64架构以获得最佳性能,避免通过Rosetta 2运行的x86_64版本以防依赖冲突和性能损失;2. 推荐使用pyenv + Homebrew或Miniforge进行安装,前者适合通用开发并可灵活管理多版本Python,后者专为数据科学优化且支…

    2025年12月15日
    000
  • python3.9中字典合并如何操作?

    Python 3.9引入|和|=操作符合并字典,|创建新字典,|=就地更新,重复键后者覆盖,相比**解包和update()更直观清晰。 在 Python 3.9 中,字典合并变得更加方便,引入了新的合并操作符。你可以使用 | 操作符来合并两个字典,也可以使用 |= 操作符来就地更新字典。 使用 | …

    2025年12月15日
    000
  • python中slice函数如何实现?

    slice 是一个内置类,用于创建切片对象以控制序列访问。通过 slice(start, stop, step) 可定义切片规则,并应用于列表、字符串等序列类型,其效果等同于 [start:stop:step] 语法。Python 在执行 my_list[2:5] 时,会将其转换为 slice(2,…

    2025年12月15日
    000
  • Python中assert函数的具体使用方法

    assert是Python关键字,用于调试时验证条件是否为真,若条件为假则抛出AssertionError异常。其语法为assert condition, message,其中condition为布尔表达式,message为可选错误信息。常用于检查输入参数、函数返回值和中间状态,如divide函数中…

    2025年12月15日
    000
  • 如何使用python中的pypy解释器?

    PyPy是Python的高性能替代解释器,通过JIT技术提升执行速度。安装方式因系统而异:Ubuntu用sudo apt install pypy3,macOS用brew install pypy3,Windows需从官网下载并配置环境变量。运行脚本使用pypy3命令,如pypy3 hello.py…

    2025年12月15日
    000
  • python中pickle模块是什么?

    pickle模块用于Python对象的序列化和反序列化,可将列表、字典、类实例等保存到文件或用于网络传输;基本用法包括使用pickle.dump()写入数据和pickle.load()读取数据;需注意其生成的是二进制格式,仅限Python内部使用,存在安全风险和版本兼容性问题,不适用于跨语言场景。 …

    2025年12月15日 好文分享
    000

发表回复

登录后才能评论
关注微信