Python实现解压rar文件
零、需求
最近在开发一个填分数的应用,需要用到selenium,那么自然需要用到浏览器,浏览器内置到应用中,但是上传到GitCode的时候被限制了,单个文件大小只能是10M以内。所以只能压缩,分卷,用的时候再解压就好。zip的分卷解压要合并后才能解压,太占用磁盘资源了,因此用rar。7z之前用过,也比较麻烦,现在想试试rar。
壹、实现
准备工作
安装rarfile
库
pip install rarfile
RAR程序
RAR不是开源的,没有Python实现,本质还是调用exe解压,故需要下载一个WinRAR,安装WinRAR后我们在WinRAR的安装目录中找到UnRAR.exe
,把这个复制到我们项目目录下即可,这样其他电脑运行我们的代码时不需要另外安装WinRAR。
代码实现
我们需要用到rarfile
这个库,这个库的用法跟Python内置的zipfile
用法一样,所以学习成本几乎为0,我们要做的就是在使用rarfile
之前把UnRAR.exe
添加到path
环境变量中去。
我们需要把UnRAR.exe
所在目录传入这个函数即可,这个函数不会改变系统的设置,只影响当前程序的环境变量,添加环境变量代码如下:
def set_path(path:str):
"""
添加目录到path环境变量中
:param path: 目录
:return: None
"""
os_path = os.environ.get('path')
if path in os_path:
return
else:
if os.path.exists(path):
os.environ['path'] = f'{os_path};{path};'
else:
raise ValueError('环境变量路径不存在')
之后是解压代码的实现,这个跟zipfile
一样用的:
def unrar_file(rar_file, target_path=None, password=None, progress_fun=None):
"""
解压rar文件
:param rar_file: 文件路径
:param target_path: 解压目标路径
:param password: 密码
:param progress_fun: 进度函数,会传递一个 0-1的进度浮点
:return: 成功 True
"""
# 设置环境变量
set_path(
get_relative_path('chrome')
)
# 设置密码
if not (password is None):
password = password.encode('utf-8')
logger.debug('解压rar文件:' + str(rar_file))
# 打开rar文件
rf = rarfile.RarFile(rar_file)
try:
file_list = rf.infolist()
# 统计总大小
all_size = 0
for i in file_list:
all_size += i.file_size
# 解压
unrar_size = 0
for file in file_list:
rf.extract(file, path=target_path, pwd=password)
unrar_size += file.file_size
# 调用显示进度的函数
if progress_fun:
progress_fun(unrar_size / all_size)
except Exception as e:
raise e
finally:
rf.close()
return True
代码中get_relative_path
函数是通过相对路径获取绝对路径的函数,这个与本文无关就不贴出了,返回就是一个绝对路径。代码中logger
是日志对象,相当于就是打印函数,可以改成print
输出。代码中progress_fun
函数是打印进度的函数,接受一个浮点数,代表进度,这个大家可以自己实现一下,也可以直接删除。
贰、参考文档
- rarfile API documentation