Python进行文件ZIP压缩与解压缩

要对zip文件进行操作,可以使用Python标准库中的zipfile模块。zipfile模块提供了丰富的方法和类用于读取、创建和操作zip文件。下面是一个对zip文件进行封装所有操作的示例,以及对每行代码的解释

import os
import zipfile

class ZipFileManager:

    def __init__(self,file_path):
        self.file_path = file_path   #要压缩zip的文件夹路径
        self.unzip_file_path = unzip_file_path   #解压缩zip的路径
        self.zip_path = zip_path

    def create_zip_from_folder(self,zip_file_path):
        """
        压缩文件夹为zip
        :param zip_file_path: 创建的zip文件路径
        :return:
        """
        with zipfile.ZipFile(zip_file_path + '.zip'  ,'w',zipfile.ZIP_DEFLATED) as zip_ref:
            for root,_,files in os.walk(self.file_path):
                for file in files:
                    path = os.path.join(root,file)
                    arc_name = os.path.relpath(path,self.file_path)
                    zip_ref.write(path,arc_name)

    def create_zip_from_folder_with_special_files(self,zip_file_path,file_names=None,file_extensions=None):
        """
        :param zip_file_path:   要压缩的文件夹路径
        :param file_names:      要压缩的特定文件名列表  如[1.txt ,2.txt]     是特定的选择的文件
        :param file_extensions: 要压缩的特定文件扩展名列表 ['.txt' , '.csv']  所有类型的后缀的文件
        :return:
        """
        with zipfile.ZipFile(zip_file_path + '.zip'  ,'w',zipfile.ZIP_DEFLATED) as zip_ref:
            for root, _, files in os.walk(self.file_path):
                for file in files:
                    path = os.path.join(root, file)
                    file_name = os.path.basename(file)
                    if file_names and file_name not in file_names:
                        continue
                    if file_extensions and not any(file.endswith(ext) for ext in file_extensions):
                        continue
                    arc_name = os.path.relpath(path, self.file_path)
                    zip_ref.write(path, arc_name)

    def extract_zip_all(self,extract_path):
        """
        将zip文件中的所有文件解压缩到指定的路径
        :param extract_path:    解压缩的路径
        :return:
        """
        with zipfile.ZipFile(self.unzip_file_path,'r') as zip_ref:
            zip_ref.extractall(extract_path)

    def extract_special_files_from_zip(self,extract_path,file_names=None,file_extensions=None):
        """
        解压缩指定的文件到指定文件夹中
        :param extract_path: 解压后的文件夹
        :param file_names:   要解压缩的特定文件名列表  如[1.txt ,2.txt]     是特定的选择的文件
        :param file_extensions: 要解压缩的特定文件扩展名列表 ['.txt' , '.csv']  所有类型的后缀的文件
        :return:
        """
        with zipfile.ZipFile(self.unzip_file_path, 'r') as zip_ref:
            for file_info in zip_ref.infolist():
                if (file_names and file_info.filename not in file_names) or (file_extensions and not any(file_info.filename.endswith(ext) for ext in file_extensions)):
                    continue
                zip_ref.extract(file_info,extract_path)

    def add_files_to_exist_zip(self,files_to_add,destination_folder=None):
        """
        :param files_to_add:  要添加的特定文件列表
        :param destination_folder 可选参数,表示可以添加到文件夹路径
        :return:
        """
        with zipfile.ZipFile(self.zip_path, 'a',zipfile.ZIP_DEFLATED) as zip_ref:
            for filepath in files_to_add:
                if destination_folder and os.path.isdir(destination_folder):
                    acrname = os.path.join(destination_folder,os.path.basename(filepath))
                else:
                    acrname = os.path.basename(filepath)
                zip_ref.write(filepath,acrname)

    def remove_files_from_zip(self, files_to_remove):
        """
        将指定的文件从zip文件中删除
        :param file_to_remove:  要删除的特定文件列表 [1.txt,2.txt]
        :return:
        """
        files_to_remove = set(files_to_remove)  #将要删除的文件名构建成集合形式
        temp_zip_file_path = self.zip_path + '.temp'  #创建一个临时文件夹保存不不需要删除的文件
        with zipfile.ZipFile(self.file_path, 'r') as zip_ref,zipfile.ZipFile(temp_zip_file_path,'w') as temp_zip_ref:
            for file_info in zip_ref.infolist():   #遍历原始.zip文件中所有文件
                if file_info.filename not in files_to_remove:
                    file_data = zip_ref.read(file_info.filename)
                    temp_zip_ref.writestr(file_info,file_data)
        os.replace(temp_zip_file_path,self.zip_path)  #替换原始的.zip文件

if __name__ == '__main__':
    pass
    file_path = ''  # 要压缩zip的文件夹路径
    unzip_file_path = '' # 解压缩zip的路径
    zip_path = '' #.zip所有路径

解释每行代码的意思:

导入zipfile模块,用于进行zip文件相关操作。
导入os模块,用于处理文件路径和文件夹操作。
create_zip_from_folder函数,将文件压缩为.zip
create_zip_from_folder_with_special_files函数, 解压缩指定的文件到指定文件夹中
extract_zip_all函数,将zip文件中的所有文件解压缩到指定的路径
extract_special_files_from_zip函数,解压缩指定的文件到指定文件夹中
add_files_to_exist_zip函数 ,添加的特定文件列表到zip中
remove_files_from_zip函数, 删除文件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

经历一个春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值