美文网首页Python自动化
python 递归解压缩zip文件

python 递归解压缩zip文件

作者: 小黄不头秃 | 来源:发表于2022-10-30 00:06 被阅读0次

如何进行递归的对压缩文件进行解压

在使用zipfile库解压压缩文件的时候,有时候会遇到一种情况,就是一个压缩文件里面还有压缩文件,所以我们需要一层一层的进入目录下面进行解压。本文提到的就是对压缩文件进行递归的解压。

这里举例的是解压缩zip格式的压缩文件,所以下面的代码只能用于解压zip格式的压缩文件,但是其他压缩类型的文件可以以此类推。

在这里面需要学会几个函数的使用:

  • zipfile.ZipFile():传入文件路径,获取压缩文件内的信息
  • zipfile.namelist():获取该目录下的文件夹名和文件名
  • zipfile.extract():解压文件到指定目录,包括文件夹
  • str.endswith():匹配文件后缀
  • list_dir():列出指定路径下的文件夹名和文件名

以下代码为递归解压缩的代码:

import shutil
import zipfile
import os
# 简洁版,仅用于递归的方式解压文件
def recursive_unzip(path, zfile):
    """解压缩文件"""
    # file_path用于解压缩文件;des_dir用于存放下一级的解压缩的同名目录
    file_path = os.path.join(path, zfile)
    des_dir = os.path.join(path, zfile[:-4])
    srcfile = zipfile.ZipFile(file_path) # 获取解压文件信息
    for file_name in srcfile.namelist(): # 获取解压文件下的目录
        srcfile.extract(file_name, des_dir) # 将zip文档内的指定文件解压到当前目录
        print("解压文件名称:",file_name)
        if file_name.endswith('.zip'): # 如果是压缩文件,则进入下一级解压
            path = des_dir
            zfile = file_name
            recursive_unzip(path, zfile)

if __name__ == '__main__':
    # 文件路径 及 该路径下的压缩文件
    path = r'../发票样例/' 
    zfiles =  [file for file in os.listdir(path) if file[-3:] == 'zip']
    for file in zfiles:
        recursive_unzip(path, file)
# 复杂版,解压文件后自动删除源文件
recursive_unzip_file = []

def recursive_unzip(path, zfile):
    # file_path用于解压缩文件;des_dir用于存放下一级的解压缩的同名目录
    file_path = os.path.join(path, zfile)
    des_dir = path + zfile[:zfile.index('.zip')]
    srcfile = zipfile.ZipFile(file_path)
    for file_name in srcfile.namelist():
        # 如果里面的文件是压缩文件,就递归的进入下一层目录
        if file_name.endswith('.zip'):
            temp_del_file = os.path.join(des_dir, file_name)
            if temp_del_file not in recursive_unzip_file:
                recursive_unzip_file.append(temp_del_file)
        srcfile.extract(file_name, des_dir) # 将zip文档内的指定文件解压到当前目录
        print("解压文件名称:",file_name)
        if file_name.endswith('.zip'):
            temp_del_file = os.path.join(des_dir, zfile)
            if temp_del_file not in recursive_unzip_file:
                recursive_unzip_file.append(temp_del_file)

            path = des_dir
            zfile = file_name
            recursive_unzip(path, zfile)

def del_file(file_path):
    """
    删除指定路径下的所有文件和文件夹
    :param file_path: 路径
    :return:
    """

    for del_file_path in file_path:
        if os.path.isfile(del_file_path):
            os.remove(del_file_path)
        elif os.path.isdir(del_file_path):
            shutil.rmtree(del_file_path)

if __name__ == '__main__':
    # 文件路径 及 该路径下的压缩文件
    path = r'../发票样例/' 
    zfiles =  [file for file in os.listdir(path) if file[-3:] == 'zip']

    recursive_unzip_file = [path+file for file in zfiles]
    print(recursive_unzip_file)
    for file in zfiles:
        recursive_unzip(path, file)
    del_file(recursive_unzip_file)

相关文章

网友评论

    本文标题:python 递归解压缩zip文件

    本文链接:https://www.haomeiwen.com/subject/tzdozrtx.html