用python解压zip文件

因为某个需求,需要用python处理解压文件,这里记录下完成的代码,需要注意的是删除解压出来的文件夹时,很多博客都说直接用removedirs就行,实际我在py3.7上测试会提示“文件夹非空”,而且想想如果直接移除了根目录还是很恐怖的,所以我这边做的处理是用MD5作为解压文件夹名称,然后删除的时候判断文件路径长度至少在32以上才执行删除

"""
用于处理文件解压缩以及删除操作
"""
import hashlib
import os
import tarfile
import zipfile
import shutil


class PackProcessor:
    """
    用于处理文件压缩,解压缩以及删除的操作
    """
    unzip_path = ""

    def __init__(self):
        """
        初始化
        """

    @staticmethod
    def compute_md5(fpath: str):
        """
        计算压缩文件的md5值
        """
        with open(fpath, 'rb') as f:
            md5_hash = hashlib.md5()
            for chunk in iter(lambda: f.read(4096), b""):
                md5_hash.update(chunk)
        hex_digest = md5_hash.hexdigest()
        return hex_digest

    @staticmethod
    def unzip(fpath: str):
        """
        解压缩文件
        """
        unzip_dir = None
        try:
            file_md5 = PackProcessor.compute_md5(fpath)
            local_dir = os.path.dirname(fpath)
            unzip_dir = os.path.join(local_dir, file_md5)
            PackProcessor.unzip_path = unzip_dir
            if fpath.endswith(".tar.gz"):
                with tarfile.open(fpath, 'r') as tar:
                    tar.extractall(unzip_dir)
            elif fpath.endswith(".whl") or fpath.endswith(".egg") or \
                    fpath.endswith(".zip"):
                with zipfile.ZipFile(fpath, 'r') as zip_file:
                    zip_file.extractall(unzip_dir)
            else:
                print("是暂不支持解压的文件")
                return None
        except Exception as e:
            print("解压失败", e)
        return unzip_dir

    @staticmethod
    def delete_unzips():
        """
        删除解压出来的文件
        """
        if os.path.exists(PackProcessor.unzip_path) and len(PackProcessor.unzip_path) >= 32:
            # 直接删除文件夹太危险,防止异常情况直接删除根目录
            try:
                shutil.rmtree(PackProcessor.unzip_path)
            except Exception as e:
                print("尝试删除失败:", PackProcessor.unzip_path, e)

    @staticmethod
    def get_dir_files(data_dir: str, file_type=''):
        """
        获取指定文件夹下所有指定字符串结尾文件的全路径,返回一个列表
        """
        result_ls = []
        for path, _, filelist in os.walk(data_dir):
            for filename in filelist:
                if filename.endswith(file_type):
                    final_path = os.path.join(path, filename)
                    final_path = final_path.replace('\\', '/')
                    # 统一换成/结尾
                    result_ls.append(final_path)
        return result_ls


if __name__ == '__main__':
    pass

你可能感兴趣的:(python,开发语言)