当前位置: 首页 > article >正文

Python如何下载文件:从基础到进阶的完整指南

在Python中下载文件是一项常见任务无论是从网页下载图片、文档还是通过API获取数据掌握文件下载技术都是开发者的必备技能。本文将系统介绍Python下载文件的多种方法涵盖基础实现、高级技巧和常见问题解决方案。一、基础方法使用标准库下载文件1. 使用urllib.requestPython内置库importurllib.request urlhttps://example.com/file.zipfilenamedownloaded_file.ziptry:urllib.request.urlretrieve(url,filename)print(f文件已下载到:{filename})exceptExceptionase:print(f下载失败:{e})特点无需安装第三方库适合简单下载场景缺乏进度显示和错误处理细节2. 使用requests库推荐importrequests urlhttps://example.com/file.zipfilenamedownloaded_file.ziptry:responserequests.get(url,streamTrue)# 使用流式下载大文件response.raise_for_status()# 检查请求是否成功withopen(filename,wb)asf:forchunkinresponse.iter_content(chunk_size8192):# 分块写入ifchunk:# 过滤掉keep-alive新块f.write(chunk)print(f文件已下载到:{filename})exceptrequests.exceptions.RequestExceptionase:print(f下载失败:{e})优势更简洁的API支持流式下载适合大文件完善的错误处理机制可添加请求头、代理等高级功能二、进阶技巧增强下载功能1. 显示下载进度importrequestsfromtqdmimporttqdm# 需要安装: pip install tqdmurlhttps://example.com/large_file.zipfilenamelarge_file.ziptry:responserequests.get(url,streamTrue)total_sizeint(response.headers.get(content-length,0))withopen(filename,wb)asf,tqdm(descfilename,totaltotal_size,unitiB,unit_scaleTrue,unit_divisor1024,)asbar:forchunkinresponse.iter_content(chunk_size8192):f.write(chunk)bar.update(len(chunk))print(\n下载完成!)exceptExceptionase:print(f下载失败:{e})2. 断点续传功能importosimportrequests urlhttps://example.com/large_file.zipfilenamelarge_file.zip# 检查是否已部分下载downloaded_size0ifos.path.exists(filename):downloaded_sizeos.path.getsize(filename)headers{Range:fbytes{downloaded_size}-}try:responserequests.get(url,headersheaders,streamTrue)response.raise_for_status()withopen(filename,ab)asf:# 以追加模式打开forchunkinresponse.iter_content(chunk_size8192):ifchunk:f.write(chunk)print(下载完成!)exceptExceptionase:print(f下载失败:{e})3. 多线程/异步下载加速下载importrequestsfromconcurrent.futuresimportThreadPoolExecutorimportosdefdownload_chunk(url,start,end,filename,chunk_num):headers{Range:fbytes{start}-{end}}try:responserequests.get(url,headersheaders,streamTrue)withopen(f{filename}.part{chunk_num},wb)asf:forchunkinresponse.iter_content(chunk_size8192):f.write(chunk)returnTrueexceptExceptionase:print(f分块{chunk_num}下载失败:{e})returnFalsedefmerge_files(filename,num_chunks):withopen(filename,wb)asoutfile:foriinrange(num_chunks):part_filenamef{filename}.part{i}ifos.path.exists(part_filename):withopen(part_filename,rb)asinfile:outfile.write(infile.read())os.remove(part_filename)urlhttps://example.com/very_large_file.zipfilenamevery_large_file.zipfile_size1024*1024*100# 假设文件100MBchunk_size1024*1024*10# 每块10MBnum_chunksfile_size//chunk_size# 创建线程池下载各分块withThreadPoolExecutor(max_workers5)asexecutor:futures[]foriinrange(num_chunks):starti*chunk_size endstartchunk_size-1ifi!num_chunks-1elsefile_size-1futures.append(executor.submit(download_chunk,url,start,end,filename,i))# 等待所有分块下载完成forfutureinfutures:future.result()# 合并分块merge_files(filename,num_chunks)print(下载并合并完成!)三、常见场景解决方案1. 下载网页上的所有资源importrequestsfrombs4importBeautifulSoupimportosdefdownload_resources(url,output_folderdownloads):os.makedirs(output_folder,exist_okTrue)try:responserequests.get(url)soupBeautifulSoup(response.text,html.parser)# 下载图片forimginsoup.find_all(img):img_urlimg.get(src)ifimg_urlandnotimg_url.startswith(data:):ifnotimg_url.startswith((http://,https://)):img_urlf{url}/{img_url}ifnoturl.endswith(/)elsef{url}{img_url}try:img_datarequests.get(img_url).content img_nameos.path.join(output_folder,img_url.split(/)[-1])withopen(img_name,wb)asf:f.write(img_data)exceptExceptionase:print(f图片下载失败:{e})# 可以类似地下载CSS/JS等资源print(资源下载完成!)exceptExceptionase:print(f网页下载失败:{e})download_resources(https://example.com)2. 使用代理下载importrequests proxies{http:http://10.10.1.10:3128,https:http://10.10.1.10:1080,}urlhttps://example.comtry:responserequests.get(url,proxiesproxies)withopen(page.html,w,encodingutf-8)asf:f.write(response.text)print(通过代理下载成功!)exceptExceptionase:print(f代理下载失败:{e})3. 处理下载重定向importrequests urlhttp://example.com/redirecting_linktry:responserequests.get(url,allow_redirectsTrue)# 默认允许重定向final_urlresponse.url# 获取最终URLprint(f最终URL:{final_url})# 下载最终文件withopen(final_file.txt,wb)asf:f.write(response.content)exceptExceptionase:print(f下载失败:{e})四、最佳实践与注意事项错误处理始终添加异常处理特别是网络请求可能因各种原因失败资源清理使用with语句确保文件正确关闭大文件处理使用流式下载(streamTrue)和分块写入安全性验证SSL证书默认行为对用户提供的URL进行验证限制文件类型和保存路径性能优化合理设置分块大小通常8KB-1MB多线程下载适合高延迟网络考虑使用异步IO如aiohttp提高并发性能五、完整示例带进度条的下载函数importrequestsfromtqdmimporttqdmimportosdefdownload_file(url,filenameNone,chunk_size8192): 下载文件并显示进度条 :param url: 文件URL :param filename: 保存文件名可选默认从URL提取 :param chunk_size: 分块大小字节 :return: 保存的文件路径 try:# 获取文件名如果未提供iffilenameisNone:filenameos.path.basename(url.split(?)[0])# 去除查询参数# 发送请求responserequests.get(url,streamTrue)response.raise_for_status()# 获取总大小如果服务器提供total_sizeint(response.headers.get(content-length,0))# 创建进度条progress_bartqdm(descfilename,totaltotal_size,unitiB,unit_scaleTrue,unit_divisor1024,)# 写入文件withopen(filename,wb)asf:forchunkinresponse.iter_content(chunk_sizechunk_size):f.write(chunk)progress_bar.update(len(chunk))progress_bar.close()print(f\n文件已保存到:{os.path.abspath(filename)})returnfilenameexceptrequests.exceptions.RequestExceptionase:print(f下载失败:{e})returnNone# 使用示例download_file(https://example.com/sample.pdf,my_document.pdf)总结Python提供了多种下载文件的方法从简单的urllib到功能强大的requests库再到结合多线程/异步的优化方案。根据实际需求选择合适的方法简单下载requests.get() 文件写入大文件下载流式下载 分块写入需要进度显示结合tqdm高并发需求多线程/异步下载特殊需求代理、断点续传等高级功能掌握这些技术后你可以轻松应对各种文件下载场景构建更健壮的Python应用程序。

相关文章:

Python如何下载文件:从基础到进阶的完整指南

在Python中下载文件是一项常见任务,无论是从网页下载图片、文档,还是通过API获取数据,掌握文件下载技术都是开发者的必备技能。本文将系统介绍Python下载文件的多种方法,涵盖基础实现、高级技巧和常见问题解决方案。一、基础方法&…...

Nodejs后端服务如何接入Taotoken多模型API接口

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Node.js 后端服务如何接入 Taotoken 多模型 API 接口 对于 Node.js 后端开发者而言,将大模型能力集成到服务中已成为提…...

CANN/ops-nn CELU激活函数

aclnnCelu&aclnnInplaceCelu 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 📄 查看源码 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DTAt…...

CANN算子库FlashAttention反向梯度计算

aclnnFlashAttentionUnpaddingScoreGrad 【免费下载链接】ops-transformer 本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-transformer 产品支持情况 产品是否支持Ascend 950PR/Ascend 9…...

Linux下Cursor编辑器试用重置脚本原理与风险分析

1. 项目概述与核心思路拆解 最近在折腾Linux下的代码编辑器,Cursor以其深度集成的AI能力确实吸引了不少开发者。但它的免费试用期结束后,弹窗提醒和功能限制就变得有些恼人。网上有不少关于如何“重置”或“延长”其使用状态的讨论,其中一种思…...

基于Alexa技能与无服务器架构的香港地铁实时查询系统开发实战

1. 项目概述与核心价值最近在折腾智能音箱的技能开发,发现一个挺有意思的开源项目:tomfong/hk-mtr-next-train-skill。这是一个为香港地铁(MTR)乘客量身定做的语音技能,让你动动嘴皮子,就能问出下一班车什么…...

AI智能体集成命令行交易:Rust CLI工具与Alpaca API实战指南

1. 项目概述:当AI智能体遇上命令行交易如果你是一名开发者,同时又对股票交易感兴趣,那么你很可能面临一个两难境地:一方面,你享受在终端里敲击命令、用脚本自动化一切的效率与掌控感;另一方面,主…...

CANN/catlass Swizzle策略说明

Swizzle策略说明 【免费下载链接】catlass 本项目是CANN的算子模板库,提供NPU上高性能矩阵乘及其相关融合类算子模板样例。 项目地址: https://gitcode.com/cann/catlass Swizzle策略决定了AI Core计算基本块的顺序。调整Swizzle策略有助于提高缓存命中率、减…...

dotai-cli:AI命令行工具的设计原理与工程实践

1. 项目概述:一个面向开发者的AI命令行工具最近在GitHub上看到一个挺有意思的项目,叫nbslabs/dotai-cli。光看名字,你可能会联想到.env文件或者dotfiles这类开发者常用的配置管理方式,没错,这个项目的核心思路就是把AI…...

CANN/ops-collections昇腾容器库

ops-collections 【免费下载链接】ops-collections ops-collections是基于昇腾硬件的高性能容器模板库,提供运行在NPU上的static_map、dynamic_map、set等容器。利用最新的SIMT并发能力,支持对容器的批量插入、查找等操作,提升整个系统的能力…...

基于Vue 3与Vite的现代化中后台前端解决方案:fast-soy-admin深度解析

1. 项目概述:一个为现代Web应用提速的“脚手架” 最近在折腾一个内部管理系统的重构,前端技术栈选型时,一个绕不开的话题就是“脚手架”。对于有一定规模的团队来说,从零开始配置Webpack、Vite、集成路由、状态管理、UI库、权限、…...

2026株洲AI床垫带来的超绝体验

床垫国标落地,大家都好奇2026年AI床垫能不能带来智能体验。我之前睡眠质量差,换了HEKA黑卡AI智能床垫后,睡眠改善不少,所以很有发言权。HEKA黑卡研发10年,内置230万组睡眠数据库,精准度有保障。它家成人床垫…...

基于Mirai与Spring Boot的QQ机器人开发实战:从零构建PCR公会战管理工具

1. 项目缘起与重生之路 作为一个在QQ机器人圈子里摸爬滚打了快十年的老玩家,我见证过不少框架的兴起与沉寂。最早自己捣鼓着用酷Q和PicqBotX框架,整合Spring写了个叫WMagicBot的小玩意儿,纯粹是自娱自乐。后来酷Q一夜之间停止服务&#xff0…...

GitHub仓库模板:现代软件项目的标准化起点与自动化实践

1. 项目概述:一个现代软件项目的“基因蓝图” 在软件开发的日常里,我们总会遇到一些重复性的“仪式感”工作:新建一个仓库,然后开始配置 .gitignore 、 README.md 、 LICENSE 、CI/CD流水线、代码规范检查工具……这些工作…...

构建AI智能体可信记忆系统:TrustMem架构、部署与调优指南

1. 项目概述:为AI智能体构建一个可信赖的“海马体”在AI智能体(AI Agent)的开发浪潮中,我们常常面临一个核心悖论:智能体拥有强大的推理与生成能力,却像一个患有严重健忘症的天才。它能在一次对话中为你撰写…...

多AI代理协同编码框架:结构化工作空间解决单代理上下文崩溃

1. 项目概述:一个为多AI代理协同编码而生的结构化工作空间如果你和我一样,在过去一年里深度使用过Claude Code、Cursor或者GitHub Copilot这类AI编程助手,那你一定经历过这种“甜蜜的烦恼”:你给AI一个复杂的任务,比如…...

量子计算与深度学习结合解决Frenkel激子模拟难题

1. 量子计算与Frenkel激子模拟的背景与挑战量子计算利用量子比特的叠加和纠缠特性,为解决复杂量子系统模拟问题提供了全新途径。在材料科学领域,Frenkel激子作为典型的局域化光学激发,其哈密顿量的求解对理解有机固体的光电性质至关重要。传统…...

Magisk深度解析:Android系统定制与Root权限的完整实战指南

Magisk深度解析:Android系统定制与Root权限的完整实战指南 【免费下载链接】Magisk The Magic Mask for Android 项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk Magisk作为Android系统定制的瑞士军刀,通过独特的系统级修改技术&#…...

AI 术语通俗词典:自动微分

自动微分是机器学习、深度学习、数值计算和人工智能中非常常见的一个术语。它用来描述:让计算机根据程序中的计算过程,自动、准确地计算导数或梯度的方法。 换句话说,自动微分是在回答:当一个模型由许多层计算组成时,怎…...

AI 术语通俗词典:学习率

学习率是机器学习、深度学习、神经网络和人工智能中非常常见的一个术语。它用来描述:模型每次根据梯度更新参数时,步子迈得有多大。 换句话说,学习率是在回答:模型知道应该往哪个方向改参数之后,到底一次应该改多少。如…...

AI 术语通俗词典:梯度下降

梯度下降是数学优化、机器学习、深度学习和人工智能中非常常见的一个术语。它用来描述一种通过沿着损失函数下降最快的方向不断调整参数,从而让模型误差逐渐变小的方法。换句话说,梯度下降是在回答:模型已经知道自己错了,那么下一…...

Scikit-learn:从数据到结构——无监督学习的最小闭环

在 Scikit-learn 中,学习无监督学习并不只是学习某个聚类算法或降维方法的调用方式,更重要的是理解:当数据没有现成标签时,如何从一批样本中发现结构、生成结果,并判断这种结构是否具有解释价值。与监督学习不同&#…...

对比自行维护API中转与使用Taotoken在稳定性上的体感差异

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 对比自行维护API中转与使用Taotoken在稳定性上的体感差异 对于需要频繁调用大模型API的开发者而言,服务的稳定性是保障…...

从java改C++后速度变化记录

基本已经实现以前java功能,似乎还是存在卡顿。也就是说暂时还没有出现所谓的5-20倍速度提升。AI辩解:主要花费时间的是模型推理,不是语言计算。------所以解决方法已经出来了:降低推理频率。...

我发现深度神经网络DNN推理图片高度300也能正常运转

我的图片默认是1600x720,我发现只要保持图片比例不变,即使把图片缩放为 高度300也还是能正常工作:这个计算的速度至少是720的4倍以上...

Genkit AI应用框架:统一接口、类型安全与RAG实战指南

1. 从零到一:为什么我们需要 Genkit 这样的 AI 应用框架? 如果你最近在尝试把大语言模型(LLM)集成到自己的应用里,不管是做个智能客服、内容摘要工具,还是更复杂的多步骤工作流,大概率已经踩过…...

基于大语言模型的LaTeX到HTML智能转换:提升学术文档可访问性

1. 项目概述:当学术文档遇见智能转换作为一名长期在学术出版和技术文档领域摸爬滚打的从业者,我几乎每天都要和LaTeX和HTML打交道。LaTeX是学术界和工程界的“标准语言”,用它排版的论文、报告、书籍,其数学公式的精美和版式的严谨…...

节点与边:LangGraph 中智能体通信的底层机制

系列导读 你现在看到的是《LangGraph 多智能体编排开发实战:从入门到企业级应用》的第 3/10 篇,当前这篇会重点解决:节点与边是 LangGraph 的编排基石,理解其底层才能灵活控制智能体流程。 上一篇回顾:第 2 篇《LangGraph 状态管理深度解析:从 State 到持久化》主要聚焦…...

机器学习求解偏微分方程:算子学习与物理信息神经网络全解析

1. 项目概述:当机器学习遇上物理方程在工程和科学计算的漫长历史中,偏微分方程一直是描述物理世界最核心的数学语言。从流体的纳维-斯托克斯方程,到电磁场的麦克斯韦方程组,再到量子力学的薛定谔方程,这些方程构成了我…...

CANN/shmem原理与架构详解

SHMEM原理概述 【免费下载链接】shmem CANN SHMEM 是面向昇腾平台的多机多卡内存通信库,基于OpenSHMEM 标准协议,实现跨设备的高效内存访问与数据同步。 项目地址: https://gitcode.com/cann/shmem SHMEM初始化流程介绍 shmem的初始化接口int ac…...