当前位置:首页 » Python爬虫 » Python3完成zip分卷压缩过程解析

Python3完成zip分卷压缩过程解析

129°c 2021年04月19日 08:28 Python爬虫 0条评论
  移步手机端

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章

应用zipfile库

查询 官方网中文文档

利用 python ()缩小 ZIP 文档,大家第一反应是应用 zipfile 库,殊不知,它的官方网文档中却确立标明“此控制模块现阶段不可以解决分卷 ZIP 文档”,(⊙﹏⊙)

瞎折腾历经

翻边了Google、CSDN、Stackoverflow等服务平台均找不到解决方法,最可靠的是启用外界解压程序完成分卷压缩的作用。可是,怎样不借助外界程序代码这一作用呢??

因此,只有自身渐渐地造轮子。看见 ZIP 格式房地产商留有的文档 ZIP File Format Specification,头痛啊(;´д`)。因此我拿着 WinHex 逐渐16进制一个一个文件对比 WinRar 建立的分卷压缩和单独 zip 文档的差别。最终还确实整出来( ̄▽ ̄)"

Python3完成zip分卷压缩过程解析第1张-python学习平台_Python基础教程-雨凡教育

假如想把单独大文件 test.zip -> 分卷文档 test.z01、test.z02、test.zip

最先,在建立的第一个分卷文档 test.z01的前边再加上 \x50\x4b\x07\x08 这个是分卷压缩的文件头(header),占4个字节数。实际上单独压缩包自身 header 就会有这个了,而分卷压缩的必须2个emmm。以后就是从单独大压缩包文档test.zip中载入 "一个分卷尺寸 -4 个字节数"的数据信息,载入test.z01中,怎样然后载入一个分卷尺寸的数据信息,载入test.z02,依此类推,最后一个分卷文件夹名称也是test.zip。

python3的编码完成

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)   # 輸出分卷压缩文档的途径

缺陷

该方式建立分卷压缩的情况下,必须先在硬盘建立一个临时性压缩文件,随后将其分拆,事实上会对硬盘载入2次,这就消耗了時间。

自然,我试着应用 ByteIO 开展字节流的缩小,可是这类方法必须先把文档读取运行内存,针对超大的文档,它是不实际的,一下子运行内存发生爆炸。

随后,我试着应用 io.pipe 的管路来解决,而 zipfile 缩小必须出示一个 file 或 file-like 目标,这一目标务必完成 seek() 和 tell() 方式来回来载入文件头信息内容,殊不知管路流没法seek回来改动数据信息。这儿,参照了python !zipfile os.pipe()探寻记,屏蔽掉 seek() 和 tell() 涵数。可是,后边我分卷时必须特定载入的字节,这就必须这两个涵数。。。我大约了解为何 zipfile 库不兼容建立分卷文档了〒▽〒

这一库的创作者也没少脱发。。。如今就将就一下,那样用着吧。。。

之上便是文中的所有内容,期待对大伙儿的学习培训有一定的协助,也期待大伙儿多多的适用大家。

欢迎阅读本文,希望本文对您有所帮助!

本文链接:http://www.cqrxzs.com/3836.html

版权声明:本文为原创文章,版权归 雨凡教育 所有,欢迎分享本文,转载请保留出处!

百度推荐获取地址:http://tuijian.baidu.com/,百度推荐可能会有一些未知的问题,使用中有任何问题请直接联系百度官方客服!

评论(0) 赞助本站

发表评论:


【顶】 【踩】 【好】 【懵】 【赞】 【表情】

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

推荐阅读
04月21日

python完成猜数字游戏

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 1825次

表明: 本例取材于《Python编程快速上手》。事例非常简单我不多讲了 立即上代码,给入门python练习用。 让你6次机遇猜对一个事先转化成好的1-20中间的整数。遮盖一下知识要点: if语句 操纵句子 random涵数 载入输入 错误处理 代码: """ 猜数字 """ from random import * secretNumber = randint(1, 20) # print(secretNumber) print('猜一个1-20中间的整数。') pri...

04月21日

Python pip 安装与应用(安装、升级、删除)

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 1712次

pip 是 Python 包可视化工具,该专用工具出示了对Python 包的搜索、下载、安装、卸载掉的作用。 pip检验升级 命令:pip list –outdated pip升级包 命令:pip install --upgrade packagename pip卸载包 命令:pip uninstall packagename pip -i 和 -U 主要参数 事例: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple...

04月20日

python集合的创建、添加及删除操作示例

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 114次

文中案例叙述了python集合的建立、加上及删掉实际操作。共享给大伙儿供大伙儿参照,实际以下: 集合时混乱可变的编码序列,集合中的原素放到{}内,集合中的原素具备唯一性。 集合中只有包含数据、字符串数组、元组等不可变的种类数据信息(换句话说可hach),而不可以包含列表、字典、集合等可变的种类数据信息 1.集合的建立 方式一:把集合立即取值给一个自变量 >>> num={1,2,3,4} 方式二:应用range目标 >>> a=set(range(...

04月20日

python的命名规则知识点总结

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 121次

python命名标准 命名设计风格 python几类不一样命名设计风格 骆驼峰式命名法(WjW) 混合式教学命名法(wjWj) 大写(WJWJWJ)或大写加下划线(WJWJWJ) 作为前缀(wjing)或后缀名(ingwj)下划线,有时候双下划线 变量 python变量分成: (1)常量 (2)公有制和独享变量 1.常量 常量全局性变量,应用大写加下划线。特定的变量表明一个常标值。 BASE_DIR = os.path.dirname(os.path.dirname(os.path.absp...

04月19日

golang生成指定位数的随机数的方法

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 117次

1.随机数 随机数,是应用一个可预测性的优化算法推算出来随机数序。在软件开发中常常必须造成随机数,如随机数短信验证码登录、做为唯一真实身份标志数据信息这些。 2.rand库 golang中造成随机数关键有两个包,分别是“math/rand”和“crypto/rand”。 “math/rand”的rand包完成了伪随机数生成器。 "crypto/rand"的rand包完成了用以加解密的更安全性的随机数生成器。 3.生成特定十位数随机数 以生成六位随机数为例子 package main impo...

04月19日

Python3完成zip分卷压缩过程解析

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 129次

应用zipfile库 查询 官方网中文文档 利用 Python 缩小 ZIP 文档,大家第一反应是应用 zipfile 库,殊不知,它的官方网文档中却确立标明“此控制模块现阶段不可以解决分卷 ZIP 文档”,(⊙﹏⊙) 瞎折腾历经 翻边了Google、CSDN、Stackoverflow等服务平台均找不到解决方法,最可靠的是启用外界解压程序完成分卷压缩的作用。可是,怎样不借助外界程序代码这一作用呢?? 因此,只有自身渐渐地造轮子。看见 ZIP 格式房地产商留有的文档 ZIP File Form...

04月19日

Django之应用celery和NGINX生成静态页面完成性能优化

发布 : | 分类 : Python爬虫 | 评论 : 0人 | 浏览 : 114次

性能优化原理: 当我们要给client浏览器返回一个页面时,我们需要去数据库查询数据并将数据和基本页面模板渲染形成页面返回给客户端,但如果每一个用户访问时都去查询一次首页的的数据时,当日访问量很大时那么无疑会给数据库查询带来很大的性能问题。为了解决这个问题,我们可以给未登录用户返回一个早就渲染好的静态首页(给已登录的用户返回一个调用缓存数据和个人数据渲染的页面),这样就可以提高网站的性能了。 使用celery生成静态首页 生成静态页面原理: 在一个为静态首页准备的基础模板之上,获取数据,使用d...

您好,欢迎到访网站!
  查看权限