python 解压文件(保持文件目录不变,解决路径乱码)

def extract_zip_recursive(zip_file, target_folder):
    # 解压缩当前的zip文件到目标文件夹
    with zipfile.ZipFile(zip_file, 'r') as zf:
        for member in zf.infolist():
            filename = decode_filename(member)
            # 构建文件的完整路径
            file_path = os.path.join(target_folder, filename)
            if member.is_dir():
                os.makedirs(file_path, exist_ok=True)
            else:
                os.makedirs(os.path.dirname(file_path), exist_ok=True)
                with zf.open(member) as source, open(file_path, "wb") as target:
                    shutil.copyfileobj(source, target)

    # 删除已解压的zip文件
    os.remove(zip_file)
    # 记录日志:解压完成
    logging.info(f'Finished extracting {zip_file}')

    # 检查解压后的文件中是否还有压缩包
    for root, _, files in os.walk(target_folder):
        for file in files:
            if file.endswith('.zip'):
                nested_zip_file = os.path.join(root, file)
                # 记录日志:开始解压嵌套的zip文件
                logging.info(f'Starting to extract nested zip {nested_zip_file}')
                # 构造解压目标文件夹路径,去除.zip后缀作为目标文件夹路径
                nested_target_folder = os.path.splitext(nested_zip_file)[0]
                # 递归解压嵌套的zip文件
                extract_zip_recursive(nested_zip_file, nested_target_folder)


def unzip_all(zip_folder):
    # 获取文件夹中所有的文件和子文件夹
    for root, _, files in os.walk(zip_folder):
        for file in files:
            if file.endswith('.zip'):
                zip_file = os.path.join(root, file)
                # 记录日志:开始解压文件
                logging.info(f'Starting to extract {zip_file}')
                # 构造解压目标文件夹路径,去除.zip后缀作为目标文件夹路径
                target_folder = os.path.splitext(zip_file)[0]
                # 解压当前的zip文件到目标文件夹
                extract_zip_recursive(zip_file, target_folder)


def print_file_paths(target_folder):
    tmp = 1
    # 遍历目标文件夹及其子文件夹中的所有文件
    for root, folders, files in os.walk(target_folder):
        for file_name in files:
            # 打印文件的完整路径
            file_path = os.path.join(root, file_name)

            # 创建新的子文件夹名称
            new_folder_name = str(tmp)
            tmp += 1
            new_folder_path = os.path.join('new', new_folder_name)
            new_folder_path = os.path.join(target_folder, new_folder_path)

            # 创建新的子文件夹
            os.makedirs(new_folder_path, exist_ok=True)

            shutil.move(file_path, new_folder_path)
            print(file_path)


def read_file(dir_path):
    # 获取文件夹中所有的文件和子文件夹
    for root, _, filenames in os.walk(dir_path):
        for filename in filenames:
            file_path = os.path.join(root, filename)
            a = read_files2.read_mdb_win(file_path)
            print(file_path)


# 示例用法:解压当前目录下所有zip文件,并删除已解压的zip文件
if __name__ == "__main__":
    current_directory = r'C:\Users\Administrator\Desktop\1'
    unzip_all(current_directory)
    print_file_paths(current_directory)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值