python实现zip分卷压缩与解压
2023-06-13 09:16:07 时间
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.解压
相关文章
- pycharm python interpreter_pycharm interpreter
- python 生成数组_Python创建数组「建议收藏」
- python移动app开发_神奇的Kivy,让Python快速开发移动app
- python解压bz2文件命令,在Python中解压缩.bz2文件
- 【说站】Python删除列表中的非字母字符
- Python实现自动回复_python 微信机器人
- python调用通达信公式_通达信公式-主力雷达Python化[通俗易懂]
- python做微信回复机器人_Python自动化脚本
- python分段线性插值_Python实现分段线性插值
- 用于查找子列表总和的 Python 程序
- Python矩阵相关运算
- python-Python与SQLite数据库-使用Python执行SQLite查询(一)
- python3-开发面试题(python)6.22基础篇(1)详解编程语言
- MyEclipse中如何配置Python开发环境详解编程语言
- Linux下增加Zip文件的实现方法(linux给zip加文件)
- 学习Python精通SQL Server操作技巧(python操作sqlserver)
- Linux下解压Zip文件的简便方式(zip怎么linux解压)
- MySQL与Python搭配,实现数据库操作。(mysql-python)
- python截图方法详解编程语言
- Python结合MySQL实现信息交互(python与mysql交互)
- 快速安装Python MySQL模块(python安装mysql模块)
- 快速查询MySQL数据库:Python篇(python查询mysql数据库)
- Linux安装Zip文件的指南(linux安装zip文件)
- Linux压缩工具:Zip打包操作(zip打包linux)
- Python实现快速连接Redis数据库(python连接redis)
- 什么是行为驱动的 Python?
- 30个深度学习库:按Python和C++等10种语言分类
- Python脚本实现Linux系统管理及自动化部署(python写linux)
- 使用Python连接MySQL数据库,实现高效数据交互(python连接mysql)
- 用Python仿写MSSQL 编程体验更有趣(python仿mssql)
- 压缩文件深入挖掘:Linux 系统下解压Zip压缩文件的方法(linux如何解压zip)
- python登陆asp网站页面的实现代码