zip分卷压缩的步骤_Python3实现zip分卷压缩过程解析
使用zipfile库
利用 Python 压缩 ZIP 文件,我们第一反应是使用 zipfile 库,然而,它的官方文档中却明确标注“此模块目前不能处理分卷 ZIP 文件”,(⊙﹏⊙)
折腾经过
翻遍了Google、CSDN、Stackoverflow等平台均未找到解决方案,最靠谱的是调用外部解压程序实现分卷压缩的功能。但是,如何不依靠外部程序实现这个功能呢??
于是乎,只能自己慢慢造轮子。看着 ZIP 格式开发商留下的文档 ZIP File Format Specification,头疼啊(;´д`)。于是我拿着 WinHex 开始16进制一个一个文件对比 WinRar 创建的分卷压缩和单个 zip 文件的差异。最后还真的整出来了( ̄▽ ̄)"
如果想把单个大文件 test.zip -> 分卷文件 test.z01、test.z02、test.zip
首先,在创建的第一个分卷文件 test.z01的前面加上 \x50\x4b\x07\x08 这个是分卷压缩的文件头(header),占4个字节。其实单个压缩文件本身 header 就有这个了,而分卷压缩的需要两个emmm。之后便是从单个大压缩文件文件test.zip中读取 "一个分卷大小 -4 个字节"的数据,写入test.z01中,如何接着读取一个分卷大小的数据,写入test.z02,以此类推,最后一个分卷文件名也是test.zip。
Python3的代码实现
import os
import zipfile
def zip_by_volume(file_path, block_size):
"""zip文件分卷压缩"""
file_size = os.path.getsize(file_path) # 文件字节数
path, file_name = os.path.split(file_path) # 除去文件名以外的path,文件名
suffix = file_name.split('.')[-1] # 文件后缀名
# 添加到临时压缩文件
zip_file = file_path + '.zip'
with zipfile.ZipFile(zip_file, 'w') as zf:
zf.write(file_path, arcname=file_name)
# 小于分卷尺寸则直接返回压缩文件路径
if file_size <= block_size:
return zip_file
else:
fp = open(zip_file, 'rb')
count = file_size // block_size + 1
# 创建分卷压缩文件的保存路径
save_dir = path + os.sep + file_name + '_split'
if os.path.exists(save_dir):
from shutil import rmtree
rmtree(save_dir)
os.mkdir(save_dir)
# 拆分压缩包为分卷文件
for i in range(1, count + 1):
_suffix = 'z{:0>2}'.format(i) if i != count else 'zip'
name = save_dir + os.sep + file_name.replace(str(suffix), _suffix)
f = open(name, 'wb+')
if i == 1:
f.write(b'\x50\x4b\x07\x08') # 添加分卷压缩header(4字节)
f.write(fp.read(block_size - 4))
else:
f.write(fp.read(block_size))
fp.close()
os.remove(zip_file) # 删除临时的 zip 文件
return save_dir
if __name__ == '__main__':
file = r"D:\Downloads\1.mp4" # 原始文件
volume_size = 1024 * 1024 * 100 # 分卷大小 100MB
path = zip_by_volume(file, volume_size)
print(path) # 输出分卷压缩文件的路径
缺点
该方法创建分卷压缩的时候,需要先在磁盘创建一个临时压缩包,然后将其拆分,实际上会对磁盘写入两次,这就浪费了时间。
当然,我尝试使用 ByteIO 进行字节流的压缩,但是这种方式需要先把文件读入内存,对于超级大的文件,这是不现实的,分分钟内存爆炸。
然后,我尝试使用 io.pipe 的管道来处理,而 zipfile 压缩需要提供一个 file 或 file-like 对象,这个对象必须实现 seek() 和 tell() 方法来回去写入文件头信息,然而管道流没办法seek回去修改数据。这里,参考了Python zipfile + os.pipe()探索记,屏蔽了 seek() 和 tell() 函数。但是,后面我分卷时需要指定读取的字节数,这就需要这两个函数。。。我大概知道为什么 zipfile 库不支持创建分卷文件了〒▽〒
这个库的作者也没少掉头发。。。现在就将就一下,这样用着吧。。。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
zip分卷压缩的步骤_Python3实现zip分卷压缩过程解析相关推荐
- zip分卷压缩的步骤_linux下分卷压缩,合并解压的3种方法
我们上传东西的时候,由于文件过大而不能上传,或者不给上传,最明显的就是发邮件了,附件最大5M,有的10M.如果超过了就郁闷了.这个时候,如果能把压缩的东西,分割开来就比较爽了,windows下面我想大 ...
- java 分卷压缩_Apache Commons Compress介绍-Zip压缩解压
Zip格式应该是最出名的压缩格式之一了,zlib.gzip这些辈分很老的库大家应该都用过,甚至大部分其他格式的压缩库,都可以处理zip格式.Commons Compress当然也少补了对zip格式的支 ...
- zip分卷压缩linux命令,linux下zip分卷压缩及linux下zip分卷解压
本文关键词:linux合并zip文件.linux下zip分卷压缩及linux下zip分卷解压.linux下zip分卷解压.linux下zip分卷压缩. 先压缩原始文件 [root@laofuxi.co ...
- python 3.7.732位安装步骤_Python3.7安装pyaudio教程解析
本人笔记本电脑安装的是 python3.7, 64位操作系统,基于x64的处理器 因为 pyaudio 暂时不支持 python3.7 和 3.8,所以若需要安装 pyaudio 需要下载 whl 文 ...
- vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)
vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩) DLL:Ionic.Zip.dll 说明: 1.解压/压缩 显示加密进度及总进度. 2.zip文件打开,浏览内部文件. ...
- 【Ubuntu】使用zip方法解压分卷压缩ZIP文件
提前检查磁盘是否有足够的空间,合并分卷压缩文件,合并完成后正常解压即可 分卷压缩文件示例:dataset.zip dataset.z01 - zip -s 0 dataset.zip --out DA ...
- zip格式压缩文件并打包下载
压缩文件并下载 zip格式压缩文件并打包下载 zip格式压缩文件并打包下载 Map<String, String> param = new HashMap<String, Strin ...
- python zipfile压缩的文件用shell命令解压_Python学习第177课——bzip2、zip方式压缩文件和解压文件...
之前我们学习了tar打包.解包.gzip压缩,现在我们学习gzip解压. ●gzip解压 现在我们把上节生成的压缩文件linux_compressed.gz进行解压,使用命令: tar -xzf li ...
- 红帽linux系统备份指令,redhat Linux系统tar、gzip、zip等压缩命令
redhat Linux系统tar.gzip.zip等压缩命令 [gzip/gunzip] gzip是压缩命令,对应的gunzip是解压命令,使用时很简单,如下: gzip file1执行压缩,压缩后 ...
- Windows下解压分卷压缩方法
各种压缩分卷格式 rar分卷格式是*.part1.rar,*.part2.rar 等等. 360分卷压缩出来的文件的名字是*.zip.001.*.zip002 等等. WinZip分卷压缩出来的文件名 ...
最新文章
- 天籁obd接口针脚定义_OBD协议介绍
- ThreadPoolExecutor 八种拒绝策略,对的,不是4种!
- Java 高阶 —— 相等性比较
- 《数字图像处理》第三版笔记(一)模糊处理
- 推荐——《梦想金山》
- 一款医疗设备用超高耐压的千兆单口网络变压器H82407SG
- 测试人员必备-adb常用基础命令
- 解决安装MATLAB2018a后出现License Manager Error -8的问题
- 谁说门户已死?从世界杯看新浪的四大优势
- 给html标签加上鼠标划过小手样式
- 程序员幽默:39个奇葩代码注释,每一个都能笑抽
- 【电驴傻瓜教程-我为人人,人人为我】
- W/View: requestLayout() improperly called by 布局GridView,一直疯狂刷新日志,导致item条目点击无效
- 导航地图2_自定义标注
- 北京工作居住证续签注意的问题
- ajax查询全国天气预报,使用聚合数据api接口
- 角雷达进入“高速增长期”,国产供应商迎来“突围”时间窗口
- 如果要设计个分布式文件系统,该从哪些方面考虑?
- 艾永亮:国产运动品牌巨头一一倒下,被抛弃的品牌该如何自救?
- 深度学习之多层感知器及激活函数
热门文章
- Android DocumentFile基本使用
- 什么是python解释器?有什么作用?
- redis(千帆竞发--分布式锁)
- Bluedroid 函数分析:BTA_GATTC_Open
- c语言ifi=1 2,2017年计算机二级考试C语言最重要的知识点
- 音乐资源免费_3个免费的音乐研究在线资源
- jsp+css实现图片自动轮换
- android京东源码下载,京东商城APP - 源码下载|通讯/手机编程|android开发|源代码 - 源码中国...
- 获取微信公众号的关注链接地址
- 规划控制下的二阶段设计理论 -【多核服务价值链协同】