讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 分片下载 + 合并的实现

阿芳大大_2620

阿芳大大_2620

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

|

588人浏览过

|

来源于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。

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

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

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工具

更多
Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

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

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

1927

2023.09.19

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

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

4538

2023.08.10

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

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

1269

2025.12.24

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

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

423

2026.01.21

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

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

579

2026.01.21

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

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

429

2026.02.06

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

253

2026.03.16

Java 多线程与并发编程实战
Java 多线程与并发编程实战

深入讲解 Java 并发编程体系,涵盖 Thread / Runnable / Callable 线程创建方式、线程生命周期与状态转换、synchronized 同步锁与 Lock/ReentrantLock 显式锁、volatile 可见性保证、ThreadPool 线程池配置与调优(核心参数/拒绝策略)、JUC 并发工具类(CountDownLatch/CyclicBarrier/Semaphore/ConcurrentHashMa

369

2026.04.17

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn