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.解压

解压.ZIP分卷文件(亲测可用)

python实现zip分卷压缩与解压的更多相关文章

  1. python用模块zlib压缩与解压字符串和文件的方法

    摘自:http://www.jb51.net/article/100218.htm Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等. python中 ...

  2. C# 使用原生 System.IO.Compression 实现 zip 的压缩与解压

    zip 是一个非常常见的压缩包格式,本文主要用于说明如何使用代码 文件或文件夹压缩为 zip压缩包及其解压操作, 我们采用的是 微软官方的实现,所以也不需要安装第三方的组件包. 使用的时候记得 usi ...

  3. python tar.gz格式压缩、解压

    一.压缩 需求描述 现在有一个目录,需要将此目录打包成tar.gz文件.因为有一个Django项目,需要用到此功能! tar.gz 目录结构如下: ./ ├── folder │   ├── .doc ...

  4. linux 下 zip unzip压缩与解压

    注:*压缩成限.zip格式文件 常用解压缩: [root@mysql test]# unzip -o test.zip -d tmp/ 将压缩文件test.zip在指定目录tmp下解压缩,如果已有相同 ...

  5. linux下tar、zip等压缩、解压命令

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...

  6. zip 的 压缩与解压

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xiananliu/article/details/23993481 zip格式是开源的相比rar格式 ...

  7. python使用zlib实现压缩与解压字符串

    命令 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompressobj 案例 >& ...

  8. java.util.zip.Deflater 压缩 inflater解压 实例

    原文:java压缩解压缩类实例[转] package com.example.helloworld; import java.io.ByteArrayOutputStream; import java ...

  9. Android 打造自己的个性化应用(五):仿墨迹天气实现续--> 使用Ant实现zip/tar的压缩与解压

    上一篇中提到对于Zip包的解压和压缩需要借助Ant 实现,我经过参考了其他的资料,整理后并加上了一些自己的看法: 这里就具体地讲下如何使用Ant进行解压缩及其原因: java中实际是提供了对  zip ...

  10. Python3实现zip分卷压缩

    Python实现zip分卷压缩 使用 zipfile 库 查看 官方中文文档 利用 Python 压缩 ZIP 文件,我们第一反应是使用 zipfile 库,然而,它的官方文档中却明确标注" ...

随机推荐

  1. 用ChatGPT,入门机器学习,太强了

    入门机器学习,对大部分人来说很简单,一本书.一份课件.一套视频足矣,但是我大胆猜测很多人大概率都没有完整看完过. 所以前些天在朋友圈抱怨了一波: 我感觉所谓牛人,大佬,刨除背景机遇,其成长路上可能也仅 ...

  2. C++岗位面试真题宝典 -- 语言基础篇

    一.C++语言基础 1.1.1 简述下C++语言的特点 参考回答: C++在C语言基础上引入了面对对象的机制,同时也兼容C语言. C++有三大特性(1)封装.(2)继承.(3)多态: C++语言编写出 ...

  3. UVA - 10935:Throwing cards away I (简单模拟)

    题目大意 桌上有一叠牌,自上而下编号为1~n.若桌上牌数大于1张,那么丢弃一张顶部牌后,再将现在的顶部牌移到最后.要求给出模拟过程和最终剩余的牌号 思路分析 典型队列模拟,丢弃即出队,移到最后即入队, ...

  4. Vue项目中使用 tinymce 富文本编辑器的方法,附完整源码

    Vue项目中使用 tinymce 富文本编辑器的方法,附完整源码 https://blog.csdn.net/snsHL9db69ccu1aIKl9r/article/details/11432414 ...

  5. 这才是你应该了解的Redis数据结构!

    深入了解Redis数据结构 Redis,作为一种高性能的内存数据库,支持多种数据结构,从简单的字符串到复杂的哈希表.在这篇博文中,我们将深入探讨Redis的一些主要数据结构,并通过详细的例子展示它们的 ...

  6. java进阶(15)--DecimalFormat、BigDecimal

    一.DecimalFormat(数字格式化) 1.数字格式化的表示: (#) 代表任意数字 (,)代表千分位 (.)代表小数 (0)代表不够时补0 2.示例

  7. 基于python的视频点播网站(python+django+vue开发的视频点播网站-视频管理系统)

    演示地址 前台地址: http://video.gitapp.cn 后台地址:http://video.gitapp.cn/admin 后台管理帐号: 用户名:admin123 密码:admin123 ...

  8. 问题--如何快速复制Typora(Markdown)中的代码块/区块等

    使用快捷键ctrl+E,选中相同格式的文字,然后快速复制即可

  9. Go——语言特性

    golang 简介 来历 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括 ...

  10. .NET集成IdGenerator生成分布式全局唯一ID

    前言 生成分布式唯一ID的方式有很多种如常见的有UUID.Snowflake(雪花算法).数据库自增ID.Redis等等,今天我们来讲讲.NET集成IdGenerator生成分布式全局唯一ID. 分布 ...