首页 > 编程语言 >Python 实现 zip 分卷解压

Python 实现 zip 分卷解压

时间:2024-01-28 17:55:16浏览次数:45  
标签:解压 files zip 分卷 Python file input

在上传数据备份到云端的时候,由于数据文件过大,可能会遇到各种各样的问题:

比如 49G 的大文件 git lfs push 到 99% 突然失败,你说心态爆炸不爆炸?

再比如某些网盘会限制单个文件上传大小限制在 4G 以内;

因此我们可能会用7z之类的压缩软件对数据文件进行分卷压缩,得到多个分卷文件,例如下面的例子:

将歌词文件夹 lyrics 压缩成6个分卷,后缀为 *.zip.00* 的格式。用鼠标操作解压这种多个分卷文件很容易,操作如下图所示:

然而有时候我们需要实现数据下载+解压的自动化,比如将数据集集成到 datasets 之类的 pypi 的 API,就需要对云端下载下来的 zip 分卷文件用代码实现解压。下面我们来提供在 python 下实现 zip 分卷解压的解决方案:

import os
import re
import zipfile
from tqdm import tqdm


def sort_files_by_extension(files):
    def key_function(file_path):
        # 获取文件路径的后缀名,以数字作为排序键
        return int(file_path.split('.')[-1])

    # 使用自定义的排序函数进行排序
    sorted_files = sorted(files, key=key_function)
    return sorted_files


def get_files_with_order(folder_path):
    files = []
    for file_name in os.listdir(folder_path):
        if re.match(r'.+\.zip\.\d{3}$', file_name):
            files.append(os.path.join(folder_path, file_name))

    return sort_files_by_extension(files)


def merge_files(input_files, output_file):
    with open(output_file, 'wb') as merged_file:
        for input_file in tqdm(input_files, desc="Merging..."):
            with open(input_file, 'rb') as f:
                merged_file.write(f.read())


def extract_zip(zip_file, extract_dir):
    # 确保目标目录存在
    os.makedirs(extract_dir, exist_ok=True)

    # 获取ZIP文件中的文件总数
    with zipfile.ZipFile(zip_file) as zip_ref:
        total_files = len(zip_ref.infolist())

        # 使用tqdm显示进度条
        with tqdm(total=total_files, desc='Extracting...', unit='file') as pbar:
            # 解压每个文件
            for file in zip_ref.infolist():
                zip_ref.extract(file, extract_dir)
                pbar.update(1)


def extract_multi_vol_zip(input_dir='folder_containing_vols', output_dir='outdir'):
    tmp_file = 'merged.zip'
    input_files = get_files_with_order(input_dir)
    merge_files(input_files, tmp_file)
    extract_zip(tmp_file, output_dir)
    os.remove(tmp_file)


extract_multi_vol_zip()

其中 folder_containing_vols 便是包含所有分卷文件的文件夹,outdir为导出解压结果的目标路径。其核心原理是:先将分卷文件按照后缀名序号顺序以字节流首尾相连,合并成单个 merge.zip 文件,后面再按照常规的解压单个 .zip 文件的方法提取压缩包。我们分别在合并文件流与解压步骤中添加了进度条,以便直观查看进度。

标签:解压,files,zip,分卷,Python,file,input
From: https://www.cnblogs.com/MuGeminorum/p/17993064

相关文章

  • python 国内各大源列表:
    附,国内各大源列表:名称地址阿里 https://mirrors.aliyun.com/pypi/simple豆瓣 http://pypi.douban.com/simple/清华大学 https://pypi.tuna.tsinghua.edu.cn/simple中国科学技术大学 https://pypi.mirrors.ustc.edu.cn/simple华中理工大学 http://pypi.hustunique.com/simple山东......
  • python第五节:集合set(2)
    集合删除remove方法如果找不到元素则报错(KeyError)。如:setVar.remove(element)setVar:为一个set类型的变量element:集合中要查找并删除的元素函数作用:在集合setVar中查找element元素,如果存在则删除;如果没找到,则报错。例子1:set1={'a','b'}set1.remove('a')#set1.remove('c......
  • python02-变量及输出
    目标变量的作用定义变量认识数据类型一.变量的作用举例体验:我们去图书馆读书,怎么样快速找到自己想要的书籍呢?是不是管理员提前将书放到固定位置,并把这个位置进行了编号,我们只需要在图书馆中按照这个编号查找指定的位置就能找到想要的书籍。这个编号其实就是把书籍存放的......
  • C-like structures in Python
    bytes转Structuredefconvert_bytes_to_structure(st:object,byte:bytes):assertctypes.sizeof(st)==len(byte),'sizeerror!need:%d,give:%d'%(ctypes.sizeof(st),len(byte))#ctypes.memmove(ctypes.pointer(st),byte,ctypes.sizeof(st))......
  • python-01注释
    一.注释的作用没有注释的代码添加注释的代码通过用自己熟悉的语言,在程序中对某些代码进行标注说明,这就是注释的作用,能够大大增强程序的可读性。二.注释的分类及语法注释分为两类:单行注释和多行注释。单行注释只能注释一行内容,语法如下:#注释内容多行......
  • python 1
    importmathdeflcm(a,b):print('最大公约数math.gcd({},{})'.format(a,b),math.gcd(a,b))returna*b//math.gcd(a,b)deflcm_range(n):lcm_value=1foriinrange(2,n+1):lcm_value=lcm(lcm_value,i)returnl......
  • Python手相识别教程16四种元素手型分类
    16四种元素分类16.1火、水、气、土虽然手掌的七种原型是评估性格的首选指南,但从多个角度看手掌也是明智之举。七种原型可以让我们看到人类大家庭中更广泛的差异。原型与原型之间的相互结合,以及基本修饰语的应用,可以让我们深入了解我们正在阅读的人的手相。虽然七种原型提供了......
  • python pandas字符处理一
    s=pd.Series(['lower','CAPITALS','thisisasentence','SwApCaSe'])s.str.lower()#转为小写s.str.upper()#转为大写s.str.title()#标题格式,每个单词大写s.str.capitalize()#首字母大写s.str.swapcase()#大小写互换s.str.casefold()#转为小......
  • python pandas 文本切片处理
    文本分隔对文本的分隔和替换是最常用的文本处理方式。对文本分隔后会生成一个列表,我们对列表进行切片操作,可以找到我们想要的内容。分隔后还可以将分隔内容展开,形成单独的行。下例以下划线对内容进行了分隔,分隔后每个内容都成为一个列表。分隔对空值不起作用。#构造数据s=p......
  • python pandas文本替换
    文本替换在进行数据处理时我们可以使用替换功能剔除我们不想要的内容,换成想要的内容。这在数据处理中经常使用,因为经过人工整理的数据往往不理想,需要进行替换操作。我们使用.str.replace()方法来完成这一操作。例如,对于以下一些金额数据,我们想去除货币符号,为后续转换为数字类型......