当前位置: 首页 > news >正文

python--文件夹的压缩和解压缩(zipfile/pyzipper)

压缩

import os
import zipfile
from loguru import logger

def zip_directory(directory, zip_file_path, password):
    '''
    压缩
    @params  directory      -->  要压缩的目标文件夹路径;
    @params  zip_file_path  -->  压缩后的文件名;
    @params  password       -->  密码;
    zipfile.ZIP_STORED:不进行压缩,只是将文件存储在 ZIP 文件中。
    zipfile.ZIP_DEFLATED:使用 DEFLATE 算法进行压缩,这是默认的压缩算法,压缩率较高。
    zipfile.ZIP_BZIP2:使用 BZIP2 算法进行压缩,压缩率通常比 DEFLATE 更高,但压缩和解压缩速度较慢。
    zipfile.ZIP_LZMA:使用 LZMA 算法进行压缩,压缩率也很高,并且在某些情况下性能优于 BZIP2。
    '''
    with zipfile.ZipFile(zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
        # zipf.setpassword(password.encode())  # zipfile压缩时设置密码不生效  需要更换模块
        for root, dirs, files in os.walk(directory):
            for file in files:
                file_path = os.path.join(root, file)
                arcname = os.path.relpath(file_path, directory) # 相对路径
                logger.debug(f'正在压缩:{file_path}-->{arcname}')
                zipf.write(file_path, arcname)

directory_to_zip = r'C:\Users\123\Desktop\train'
zip_file = r'C:\Users\123\Desktop\5656\directory.zip'
password = 'zhimakaimen'
zip_directory(directory_to_zip, zip_file, password)

解压缩

解压缩全部

import zipfile


def unzip_file(zip_file_path, extract_path):
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
        zip_ref.setpassword('zhimakaimen'.encode())
        zip_ref.extractall(extract_path)
    print(f"成功将 {zip_file_path} 解压缩到 {extract_path}")


# 请替换为实际的 ZIP 文件路径
zip_file = r'C:\Users\123\Desktop\5656\train.zip'
# 请替换为实际要解压缩到的目录
extract_dir = r'C:\Users\123\Desktop\5656\123'
unzip_file(zip_file, extract_dir)

逐个文件解压缩

def unzip_with_password(zip_file_path, extract_path, password):
    try:
        with zipfile.ZipFile(zip_file_path, 'r') as zipf:
            zipf.setpassword(password.encode())
            # 获取 ZIP 文件中的所有文件信息
            file_list = zipf.namelist()
            total_files = len(file_list)
            print(f"开始解压缩,共有 {total_files} 个文件需要解压缩。")
            for index, file in enumerate(file_list, start=1):
                # 提取单个文件
                zipf.extract(file, extract_path)
                print(f"已解压缩文件 {index}/{total_files}: {file}")
        print("解压缩成功!")
    except Exception as e:
        print(f"解压缩失败: {e}")

unzip_with_password(r'C:\Users\123\Desktop\5656\directory.zip', r'C:\Users\123\Desktop\5656\123', 'zhimakaimen')

pyzipper 第三方模块

import pyzipper
import os


def compress_files(files, zip_file_path, password):
    """
    压缩文件到带密码的 ZIP 文件
    :param files: 要压缩的文件列表
    :param zip_file_path: 压缩后的 ZIP 文件路径
    :param password: 压缩密码
    """
    with pyzipper.AESZipFile(zip_file_path, 'w',
                             compression=pyzipper.ZIP_DEFLATED,
                             encryption=pyzipper.WZ_AES) as zipf:
        zipf.setpassword(password.encode())
        for file in files:
            if os.path.isfile(file):
                arcname = os.path.basename(file)
                zipf.write(file, arcname)
            else:
                print(f"{file} 不是有效的文件,跳过。")


def decompress_file(zip_file_path, extract_path, password):
    """
    解压缩带密码的 ZIP 文件
    :param zip_file_path: 要解压缩的 ZIP 文件路径
    :param extract_path: 解压缩的目标路径
    :param password: 压缩密码
    """
    try:
        with pyzipper.AESZipFile(zip_file_path, 'r') as zipf:
            zipf.setpassword(password.encode())
            file_list = zipf.namelist()
            total_files = len(file_list)
            print(f"开始解压缩,共有 {total_files} 个文件需要解压缩。")
            for index, file in enumerate(file_list, start=1):
                zipf.extract(file, extract_path)
                print(f"已解压缩文件 {index}/{total_files}: {file}")
        print("解压缩成功!")
    except Exception as e:
        print(f"解压缩失败: {e}")


# 示例使用
files_to_compress = ['file1.txt', 'file2.txt']
zip_file = 'encrypted.zip'
password = 'your_password'
extract_path = '.'

# 压缩文件
compress_files(files_to_compress, zip_file, password)

# 解压缩文件
decompress_file(zip_file, extract_path, password)
http://www.dtcms.com/a/109077.html

相关文章:

  • Day15——路由
  • 飞浆PaddlePaddle 猫狗数据大战
  • Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified
  • 学习threejs,使用Texture纹理贴图,测试repeat重复纹理贴图
  • ngx_regex_init
  • C语言基础要素(019):输出ASCII码表
  • 李沐 X 动手学深度学习--第九章 现代循环神经网络
  • webstorm初始化配置项目
  • MySQL学习集--DDL
  • Python 数据科学实战指南:从零开始构建高效分析流程
  • 单片机学习之SPI
  • JVM深入原理(七)(一):运行时数据区
  • 图形界面设计理念
  • 使用 PyTorch 的 `optim.lr_scheduler.CosineAnnealingLR` 学习率调度器
  • 蓝桥云客-修建灌木
  • Ubuntu环境基于Ollama部署DeepSeek+Open-Webui实现本地部署大模型-无脑部署
  • 静态库和动态库
  • 数据结构复习(单调栈,单调队列,KMP,manacher,tire,字符串哈希)
  • HTML 音频(Audio)学习笔记
  • 时间数据的可视化
  • 什么是msvcp140.dll?msvcp140.dll丢失的解决方法又有哪些?
  • 运算放大器(四)滤波电路(滤波器)
  • Apollo配置中心登陆页面表单密码加密提交
  • 2025年通信安全员 B 证考试真题分享
  • Windows 系统 Git 2.15.0 (64位) 下载与安装教程
  • 使用 PyTorch 的 `GradualWarmupScheduler` 实现学习率预热
  • Java全栈面试宝典:线程协作与Spring Bean管理深度解析
  • echarts 各类统计图 高分辨下文字模糊
  • SpringBoot全局exception处理最佳实践
  • MySQL深入