python实现zip分卷压缩与解压
2023-02-18 16:37:11 时间
1. python实现zip分卷压缩
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
1.1 代码如下:
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) # 输出分卷压缩文件的路径
1.2 缺点:
该方法创建分卷压缩的时候,需要先在磁盘创建一个临时压缩包,然后将其拆分,实际上会对磁盘写入两次,这就浪费了时间。
当然,使用 ByteIO 进行字节流的压缩,但是这种方式需要先把文件读入内存,对于超级大的文件,这是不现实的,分分钟内存爆炸
2.解压
相关文章
- pybind11 大大简化 Python 调用 C/C++
- 4 年时间让 Python 性能提升 5 倍
- Python 越来越优雅了
- Python-3.12 性能分析特性
- 手把手教你MacOS系统下Python的安装和配置
- 如何在Rstudio中使用Python?
- 基于Prometheus的监控告警系统的Python开发
- 用Python机器学习模型预测世界杯结果靠谱吗?附代码数据集
- 挑战30天学完Python:Day1火力全开-初识Python(含系列大纲)
- python自动化之BeautifulReport显示异常的解决方案
- Python遍历列表remove漏删解决方案
- python之pyinstaller打包问题系列(二)
- python之对比两张图像的相似度
- python之筛选图像中是否存在黑白背景
- 利用Python实现视频号自动赚钱一条龙
- 用 Python 写 3D 游戏,太赞了
- 成都核酸系统崩了,东软被市民连夜骂上了热榜第一,我用Python爬取了评论区,发现...
- Python实现实验室药品管理和预警系统(毕设源码)
- Python实现疫情医疗信息管理系统(附源码)
- 用Python写了一个合同帐务系统(附源码)