Python3实现zip分卷压缩过程解析_python

来源:脚本之家  责任编辑:小易  

找到 那个 7z 001 就是开始文件 点击右键 然后解压缩到 7z文件夹 记得要把所有的带7z 00*的文件放在同一个文件夹里,然后它会自动把所有的零碎文件 还原成一个文件www.zgxue.com防采集请勿采集本网。

使用zipfile库

zip格式的压缩文件可以利用“安卓百解压”APP进行解压,操作的方法如下: 1、打开手机,然后找到手机中的“安卓解压”APP(没有安装该软件的可以通过手机中的应用商城下载安装): 2、然后打开

查看 官方中文文档

使用zlib解压缩字符串: import zlib message='aaaabbbbccccdddd' compressed=zlib.compress(message) decompressed=zlib.decompress(compressed) print 'original:',repr(message) print '

利用 Python 压缩 ZIP 文件,我们第一反应是使用 zipfile 库,然而,它的官方文档中却明确标注“此模块目前不能处理分卷 ZIP 文件”,(⊙﹏⊙)

这种压缩机制是一种很方便的发明,尤其是对网络用户,因为它可以减小文件中的比特和字节总数,使文件能够通过较慢的互联网连接实现更快传输,此外还可以减少文件的磁盘占用空间。参考资料来源:百度百科—

折腾经过

翻遍了Google、CSDN、Stackoverflow等平台均未找到解决方案,最靠谱的是调用外部解压程序实现分卷压缩的功能。但是,如何不依靠外部程序实现这个功能呢??

直接用java 调用wondows 的cmd 就行了,至于这个具体的命令 是7-zip提供的,这个需要去看看7-zip的文档.

于是乎,只能自己慢慢造轮子。看着 ZIP 格式开发商留下的文档 ZIP File Format Specification,头疼啊(;´д`)。于是我拿着 WinHex 开始16进制一个一个文件对比 WinRar 创建的分卷压缩和单个 zip 文件的差异。最后还真的整出来了( ̄▽ ̄)"

手机端解知压:xplore能解压单个的rar、zip,压缩zip;activefile只能解压和压缩单个的zip。FreeUnRAR可以在手机端解压分卷rar:RAR解压-FreeUnRAR v1.00正式版 支持分卷解压,支持有密码压缩包

如果想把单个大文件 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 osimport zipfiledef 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_dirif __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或rar等压缩软zd件进行压缩时,根据需要大小,分别压缩成若干的小文件。便于软盘储存、邮件发送等。但它们组合是一个整体,必须按照生成的顺序编号才能解压出原文件,缺一不可。在WinRAR中也集成了分卷压缩的功能,而且它并不像WinZip那样必须在软盘的支持下才可以使用这个功能,在制作的时候能够将某个大文件分卷压缩存放在任意指定的盘符中,所以这也大大的方便了我们的使用。扩展专资料大部分主流压缩属都支持分卷压缩了,常见的格式有:7z、ace、alz、bz2、gz、mou、rar、bz2、zip、zipx等。但不是所有支持上述格式的软件都支持分卷有很多是不支持分卷的,但是官方的软件都可以完美的支持自己格式的分卷,比如:7-ZIP支持7z分卷,winace支持ace分卷,alzip支持alz分卷,winmount支持mou分卷,winrar支持rar分卷,winzip支持zip zipx分卷。参考资料来源:百度百科-分卷压缩参考资料来源:百度百科-压缩分卷,说明你下载的文件是分卷压缩的文件,不是一个,而是二个或几个文件,你可能只下载了其中的一个,所以提示你需要下一个文件/本回答被提问者采纳,原文件在压缩时被拆分成多个压缩包,在还原时必须把这些压缩包都放在一个文件夹里才能正常还原为原文件。  大文件压缩时,可以将其分成若干等份分卷压缩,如100M文件可分成10个10M分卷进行压缩。解压时,应将10个分卷调到一个文件夹进行解压,才能合并成一个文件,否则报错并提醒需要解压分卷。这和你用什么压缩软件没关系哦!  分卷压缩是拆分压缩文件的一部分,支持ZIP和7Z压缩文件格式,通常分卷压缩是在将大型的压缩文件保存到数个磁盘或是可移动磁盘时使用。  默认分卷命名规则:  ZIP格式:name.z<编号>;  7Z格式: name.7z.<编号>;  论坛专用分卷的使用:  默认不显示,在分卷大小输入框中输入数值后出现,适用于论坛上传分卷,只能用2345好压打开。  论坛专用分卷命名规则:  ZIP格式:name.haozip<编号>.zip;  7Z格式: name.haozip<编号>.7z;  固实分卷:  第一个自解压卷有不同的文件扩展名,例如对于DOS自解压卷是.exe。  分卷输入框除了选择下拉框中的选项外,还支持自由输入大小及单位(KB,MB等)。  创建后的分卷是不可能添加,更新或删除文件的。  解压分卷:  要解压分卷时,您必须从第一个分卷开始解压(有.7z或者.zip扩展名)。如果分卷存在例如硬盘等的非7a64e78988e69d8331333337623463可移动磁盘时,在解压之前,必须将全部的分卷放在同一个文件夹内内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • python中zip()函数的简单用法举例
  • python批量解压zip文件的方法
  • python3实现的zip格式压缩文件夹操作示例
  • 对python之gzip文件读写的方法详解
  • 对python读取zip压缩文件里面的csv数据实例详解
  • python读取有密码的zip压缩文件实例
  • python解压 rar、zip、tar文件的方法
  • python利用itertools生成密码字典并多线程撞库破解rar密码
  • windows系统中python使用rar命令压缩多个文件夹示例
  • 如何使用python破解zip或rar压缩文件密码
  • python 读取linux服务器上的文件方法
  • python smallseg分词用法实例分析
  • django文件上传与下载(fileflid)
  • python 自动安装 rising 杀毒软件
  • python gui库图形界面开发之pyqt5打印控件qprinter详细使用方法与
  • python字符串替换的2种方法
  • python解析html开发库pyquery使用方法
  • django缓存配置的几种方法详解
  • pycharm 创建 django admin 用户名和密码的实例
  • python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代
  • 解压文件时说需要下一压缩分卷什么意思,咋办?
  • 7-ZIP怎么对文件进行分卷压缩??
  • 7ZIP如何实现对ZIP文件的分卷
  • python怎样压缩和解压缩ZIP文件
  • 安卓手机里怎么解压分卷4G的zip压缩文件
  • python怎样压缩和解压缩ZIP文件
  • 压缩文件时ZIP和RAR格式有什么区别?
  • java怎么实现zip分卷压缩有关问题
  • 手机怎么解压分卷文件
  • 关于zip分卷压缩的密码破解方法
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全vbsdos/bathtahtcpythonperl游戏相关vba远程脚本coldfusionruby专题autoitseraphzonepowershelllinux shellluagolangerlang其它首页pythonpython中zip()函数的简单用法举例python批量解压zip文件的方法python3实现的zip格式压缩文件夹操作示例对python之gzip文件读写的方法详解对python读取zip压缩文件里面的csv数据实例详解python读取有密码的zip压缩文件实例python解压 rar、zip、tar文件的方法python利用itertools生成密码字典并多线程撞库破解rar密码windows系统中python使用rar命令压缩多个文件夹示例如何使用python破解zip或rar压缩文件密码python 读取linux服务器上的文件方法python smallseg分词用法实例分析django文件上传与下载(fileflid)python 自动安装 rising 杀毒软件python gui库图形界面开发之pyqt5打印控件qprinter详细使用方法与python字符串替换的2种方法python解析html开发库pyquery使用方法django缓存配置的几种方法详解pycharm 创建 django admin 用户名和密码的实例python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代python入门教程 超详细1小时学会python 列表(list)操作方法详解python 元组(tuple)操作详解python 字典(dictionary)操作详解pycharm 使用心得(一)安装和首python strip()函数 介绍python 中文乱码问题深入分析python中使用xlrd、xlwt操作excepython科学计算环境推荐——anacpython逐行读取文件内容的三种方pyqt5 vscode联合操作qtdesigner的方法python实现将通信达.day文件读取为datafrpython2和python3中@abstractmethod使用方python爬虫之pandas基本安装与使用方法示30秒学会30个超实用python代码片段【收藏python logging 日志轮转文件不删除问题的利用django-environ如何区分不同环境python中的一些类型转换函数小结python科学计算包numpy用法实例详解python判断列表是否已排序的各种方法及其
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved