0

0

Python 分片下载 + 合并的实现

舞夢輝影

舞夢輝影

发布时间:2026-02-21 14:26:53

|

528人浏览过

|

来源于php中文网

原创

分片下载需动态计算range:起始为i×chunk_size,结束为min((i+1)×chunk_size−1, content-length−1),用bytes={start}-{end};多线程须各写独立临时文件,合并时用shutil.copyfileobj流式追加写入。

python 分片下载 + 合并的实现

requests 分片下载时 Range 头怎么设才不越界

分片下载失败,十有八九是 Range 值算错了——特别是最后一个分片,容易设成超出文件总大小,触发 416 Range Not Satisfiable 错误。

关键不是“按固定大小切”,而是根据服务器返回的 Content-Length 动态算结尾字节位置:

  • 先发 HEAD 请求拿到 Content-Length(比如 1234567
  • 设分片大小为 chunk_size = 1024 * 1024(1MB),则第 i 片起始为 i * chunk_size
  • 结束位置取 min((i + 1) * chunk_size - 1, content_length - 1),注意减 1(Range 是闭区间)
  • 请求头必须带 headers={'Range': f'bytes={start}-{end}'},不能漏 bytes=

多线程写入同一个文件会损坏数据吗

会。直接用多个线程对同一文件句柄调用 write(),不加锁、不预分配,结果就是字节错乱、内容覆盖——哪怕你算好了每个线程该写哪段。

安全做法只有一条:每个线程写自己的临时文件,合并阶段再顺序拼接。

立即学习Python免费学习笔记(深入)”;

  • 分片下载时,给每片生成唯一临时名,如 f"part_{i:04d}.tmp"
  • 下载完全部分片后,按序读取这些 .tmp 文件,用 open(..., 'ab') 追加写入目标文件
  • 别用内存拼接大文件(比如 b''.join(chunks)),内存爆掉比下载慢更致命

合并时用 shutil.copyfileobj 还是 open().read()

shutil.copyfileobj。它底层用小缓冲块(默认 64KB)流式读写,内存占用稳定;而 open().read() 会把整个分片一次性加载进内存,100MB 分片就占 100MB 内存,N 片并发下载时极易 OOM。

动易网上商城管理系统 2006 Sp6 Build 1120 普及版
动易网上商城管理系统 2006 Sp6 Build 1120 普及版

将产品展示、购物管理、资金管理等功能相结合,并提供了简易的操作、丰富的功能和完善的权限管理,为用户提供了一个低成本、高效率的网上商城建设方案包含PowerEasy CMS普及版,主要功能模块:文章频道、下载频道、图片频道、留言频道、采集管理、商城模块、商城日常操作模块500个订单限制(超出限制后只能查看和删除,不能进行其他处理) 无订单处理权限分配功能(只有超级管理员才能处理订单)

下载

实操示例(合并单个分片):

with open("part_0001.tmp", "rb") as fsrc:
    with open("output.zip", "ab") as fdst:
        shutil.copyfileobj(fsrc, fdst)
  • shutil.copyfileobj 默认缓冲区够用,不用改 length 参数
  • 确保目标文件以 "ab" 模式打开(追加二进制),不是 "wb"
  • 如果分片数多,合并循环里别重复 open("output.zip", "ab"),应该在外层打开一次,传进去

断点续传怎么判断哪些分片已下载完成

不能靠文件存在就认为下载完成——可能写了一半就中断了。得校验实际字节数是否匹配预期。

每个分片下载前,先检查对应临时文件:

  • 若文件不存在 → 正常下载
  • 若存在但 os.path.getsize(path) != expected_size → 删除重下(expected_size = end - start + 1
  • 若大小匹配 → 跳过,直接进入合并流程
  • 别用 os.path.exists() 单独判断,那是坑

临时文件名建议包含起始偏移和长度(如 part_0_1048575.tmp),方便调试时一眼看出范围。

最麻烦的其实是网络波动导致部分分片反复失败,这时候重试逻辑要配超时和指数退避,而不是死循环重试。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

951

2023.09.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

695

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

369

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

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

26

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

25

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

99

2026.02.06

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

868

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

276

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

178

2026.02.13

热门下载

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

精品课程

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

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 4.4万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.6万人学习

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

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