要对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函数, 删除文件