不懂python分包压缩的方法?其实想解决这个问题也不难、下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。
利用python压缩ZIP文件,我们第一反应是使用zipfile库,然而,它的官方文档中却明确标注“此模块目前不能处理分卷压缩文件”(⊙﹏⊙)
<强> 1,折腾经过:强>
翻遍了谷歌,CSDN, Stackoverflow等平台均未找到解决方案,最靠谱的是调用外部解压程序实现分卷压缩的功能。但是,如何不依靠外部程序实现这个功能呢? ?
于是乎,只能自己慢慢造轮子。看着邮政格式开发商留下的文档ZIP文件格式规范,头疼啊(;′д”)。于是我拿着WinHex开始16进制一个一个文件对比解压缩的软件创建的分卷压缩和单个邮政文件的差异。最后还真的整出来了( ̄▽ ̄)“
如果想把单个大文件测试。zip→分卷文件test.z01 test.z02,测试。zip
首先,在创建的第一个分卷文件测试。z01的前面加上\×50 \ x4b \ x07 \(这个是分卷压缩的文件头(头),占4个字节。其实单个压缩文件本身头就有这个了,而分卷压缩的需要两个emmm。之后便是从单个大压缩文件文件测试。zip中读取“一个分卷大小4个字节“的数据,写入test.z01中,如何接着读取一个分卷大小的数据,写入test.z02,以此类推,最后一个分卷文件名也是测试。zip .
<强> 2,Python3的代码实现:强>
import 操作系统 import zipfile def zip_by_volume (file_path, block_size): ,,,“““zip文件分卷压缩“““ ,,,file_size =, os.path.getsize (file_path),, #,文件字节数 ,,,,,file_name =, os.path.split (file_path),, #,除去文件名以外的道路,文件名 ,,,suffix =, file_name.split(& # 39; # 39;公司)[1],,#,文件后缀名 ,,,#,添加到临时压缩文件 ,,,zip_file =, file_path +, & # 39; . zip # 39; ,,,with zipfile.ZipFile (zip_file, & # 39; w # 39;), as zf: ,,,,,,,zf.write (file_path, arcname=file_name) ,,,#,小于分卷尺寸则直接返回压缩文件路径 ,,,if file_size & lt;=, block_size: ,,,,,,,return zip_file ,,,: ,,,,,,,fp =,开放(zip_file, & # 39; rb # 39;) ,,,,,,,count =, file_size //, block_size + 1 ,,,,,,,#,创建分卷压缩文件的保存路径 ,,,,,,,save_dir =, path +, os.sep +, file_name +, & # 39; _split& # 39; ,,,,,,,if os.path.exists (save_dir): ,,,,,,,,,,,得到shutil import rmtree ,,,,,,,,,,,rmtree (save_dir) ,,,,,,,os.mkdir (save_dir) ,,,,,,,#,拆分压缩包为分卷文件 ,,,,,,,for 小姐:拷贝范围(1,count +, 1): ,,,,,,,,,,,_suffix =, & # 39; z{: 0比2}& # 39;.format (i), if 小姐:!=,count else & # 39;邮政# 39; ,,,,,,,,,,,name =, save_dir +, os.sep +, file_name.replace (str(后缀),_suffix) ,,,,,,,,,,,f =,开放(名字,,& # 39;wb + & # 39;) ,,,,,,,,,,,if 小姐:==,1: ,,,,,,,,,,,,,,,f.write (b # 39; \×50 \ x4b \ x07 \(,),, #,添加分卷压缩头(4字节) ,,,,,,,,,,,,,,,f.write (fp.read (block_size 作用;4)) ,,,,,,,,,,,其他的: ,,,,,,,,,,,,,,,f.write (fp.read (block_size)) ,,,,,,,fp.close () ,,,,,,,os.remove (zip_file),,,,, #,删除临时的,zip 文件,,, ,,,,,,,return save_dir if __name__ ==, & # 39; __main__ # 39;: ,,,file =, r" D: \下载\ 1. mp4",,,,,,,, #,原始文件 ,,,volume_size =, 1024, *, 1024, *, 100,, #,分卷大小,100 mb ,,,path =, zip_by_volume(文件,,volume_size) ,,,print(路径),,,,,#,输出分卷压缩文件的路径
<强> 3,缺点:强>
该方法创建分卷压缩的时候,需要先在磁盘创建一个临时压缩包,然后将其拆分,实际上会对磁盘写入两次,这就浪费了时间。
当然,我尝试使用ByteIO进行字节流的压缩,但是这种方式需要先把文件读入内存,对于超级大的文件,这是不现实的,分分钟内存爆炸。
然后,我尝试使用。null