美文网首页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