压缩为rar使用zipfile三方库即可
解压缩则有一个特殊处理:
安装WinRAR.exe程序后,在安装目录有一个名为"UnRAR.exe" 文件,需要把"UnRAR.exe"的文件拷贝到执行的代码同一个目录下
代码如下:
import os
import rarfile
import zipfile
class RarOperations:
def __init__(self):
self.folder_path = folder_path #要压缩的原始文件夹
self.extract_path = extract_path #解压缩的到路径文件夹
self.rar_path = rar_path #生成的rar文件 如2.rar
def compress_folder_to_rar(self):
"""
压缩文件夹为.rar
:return:
"""
with zipfile.ZipFile(self.rar_path + '.rar' ,'w',zipfile.ZIP_DEFLATED) as rar:
for root,_,files in os.walk(self.folder_path):
for file in files:
file_path = os.path.join(root,file)
arc_name = os.path.relpath(file_path,self.folder_path) #获取文件rar中相对路径
rar.write(file_path,arc_name) #将文件添加到rar文件中
def compress_rar_from_folder_with_special_files(self,file_names=None,file_extensions=None):
"""
:param rar_file_path: 要压缩的文件夹路径
:param file_names: 要压缩的特定文件名列表 如[1.txt ,2.txt] 是特定的选择的文件
:param file_extensions: 要压缩的特定文件扩展名列表 ['.txt' , '.csv'] 所有类型的后缀的文件
:return:
"""
with zipfile.ZipFile(self.rar_path + '.rar' ,'w',zipfile.ZIP_DEFLATED) as zip_ref:
for root, _, files in os.walk(self.folder_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.folder_path)
zip_ref.write(path, arc_name)
def extract_rar(self):
with rarfile.RarFile(self.rar_path,'r') as rar:
rar.extractall(self.extract_path)
if __name__ == '__main__':
rar_path = r'D:\remote1'
extract_path = r'D:\2023'
folder_path = r'D:\remote'
# RarOperations().compress_folder_to_rar()
# RarOperations().compress_rar_from_folder_with_special_files(file_extensions=['.xml'])
# RarOperations().extract_rar()
解释:
首先,我们导入了需要的库:zipfile用于创建和处理ZIP、RAR格式的压缩文件,os用于操作文件和文件夹。
定义了一个名为compress_folder_to_rar的函数,它接受两个参数:folder_path表示要压缩的文件夹路径,rar_path表示压缩后的RAR文件路径。
在函数内部,我们使用zipfile.ZipFile类创建了一个RAR文件对象,并传递了rar_path、'w'(表示写入)和zipfile.ZIP_DEFLATED(用于指定压缩算法)作为参数。使用with语句可以确保在完成压缩操作后自动关闭RAR文件。
使用os.walk函数遍历文件夹中的所有文件和子文件夹。os.walk会生成一个三元组(root, dirs, files),其中root表示当前文件夹路径,dirs表示当前文件夹中的子文件夹列表,files表示当前文件夹中的文件列表。
循环遍历files中的文件列表,得到每个文件的路径file_path。
使用os.path.relpath函数获取file_path相对于folder_path的相对路径,并将其赋值给rar_path_within_rar变量。这样可以在RAR文件中保持文件的相对路径结构。
使用rar.write方法将文件添加到RAR文件中,并将rar_path_within_rar作为arcname参数传递。这样可以将文件保存在RAR文件中的指定路径下。
在示例用法部分,我们设置了folder_path和rar_path的示例路径,并调用compress_folder_to_rar函数进行压缩。