【Python】Python实现解压rar文件
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函数是打印进度的函数,接受一个浮点数,代表进度,这个大家可以自己实现一下,也可以直接删除。
贰、参考文档
【Python】Python实现解压rar文件的更多相关文章
- python循环解压rar文件
python循环解压rar文件 C:. │ main.py │ ├─1_STL_算法简介 │ STL_算法简介.rar │ └─2_STL_算法_填充新值 STL_算法_填充新值.rar 事情是这样的 ...
- ubuntu解压rar文件
一般通过默认安装的ubuntu是不能解压rar文件的,只有在安装了rar解压工具之后,才可以解压.其实在ubuntu下安装rar解压工具是非常简 单的,只需要两个步骤就可以迅速搞定. ubuntu 下 ...
- CentOS解压rar文件
默认不能解压rar文件. 进官网下载:http://www.rarsoft.com/download.htm RAR 5.40 for Linux x64 安装: # tar -zxvf rarlin ...
- rar x 解压rar文件,提示permission denied
问题: 解压rar文件,提示
- Linux解压rar文件
Linux解压rar文件(unrar安装和使用,分卷解压) windows平台很多压缩文档为rar文件,那么怎么做到Linux解压rar文件(unrar安装和使用)? 简单,centos5安装unra ...
- linux(redhat)环境下,如何解压rar文件?
需求描述: 今天一个同事发过来一个压缩文件,让传送到linux服务器上,传上去之后,发现是rar格式的 之前没有解压过,就找了一些解压方法,在此记录下. 操作过程: 1.下载rar在linux环境下的 ...
- java 提取(解压)rar文件中特定后缀的文件并保存到指定目录
内容简介 本文主要介绍使用junrar来提取rar压缩文件中特定后缀(如:png,jpg)的文件并保存到指定目录下. 支持v4及以下版本压缩文件,不支持v5及以上. 在rar文件上右键,查看属性,在压 ...
- Ubuntu 16.04安装unrar解压RAR文件
除了7zip:http://www.cnblogs.com/EasonJim/p/7124306.html之外,还可以安装unrar进行解压RAR文件. 安装 sudo apt-get install ...
- linux 下面压缩、解压.rar文件
一,解压问题 在网上下东西的时候,经常会遇到.rar后缀的文件,我用tar解压,解压不出,上网找啊找,一直没找到什么合适的工具来压缩和解压.rar后缀的文件,现在我找到了. 二,rar和unrar安装 ...
- linux中解压rar文件
linux平台默认是不支持RAR文件的解压,需要安装linux版本的RAR压缩软件,下载地址为:http://www.rarlab.com/download.htm 下载之后进行解压之后,进入rar目 ...
随机推荐
- 【源码】Kafka订制协议如何处理粘拆包
前言 在上一篇随笔中,我们探讨了如何使用 Netty 处理自定义协议中的粘包和拆包问题.Netty 提供了高度封装的 API,帮助开发者轻松应对这一挑战,因此很多人都对其解决方案非常熟悉. 但如果我们 ...
- 巧用VTable打造炫酷金字塔图表
在数据分析和可视化领域,表格是展示数据直观.有效的方式之一.今天,就让我们来探索如何利用VTable这个强大的表格组件,制作出既美观又富有信息量的金字塔图表,以及深入了解VTable中各种单元格类型的 ...
- WPF中webview2鼠标移动窗体
WPF里webview2会一直处于其他控件最上层,是个历史遗留问题. 为了能在webview2里鼠标移动让窗体跟着移动位置代码如下: async Task InitializeAsync() { Ap ...
- Java Spring Cloud Nacos 配置修改不生效的解决方法
一.引言 在微服务架构中,配置管理是一个关键部分.Nacos作为一个动态服务发现.配置管理和服务管理平台,广泛应用于Java Spring Cloud项目中.然而,有时在修改Nacos配置后,这些更改 ...
- unified-message(统一消息平台)开源项目介绍
unified-message(统一消息平台),为业务系统提供了标准的消息发送功能 支持发送短信.邮件.企业微信等消息,可以扩展支持其它的消息类型 可以通过手机号.邮件.企业微信用户名直接发送, 可以 ...
- 学弟一看就会的RDKX5模型转换及部署,你确定不学?
作者:SkyXZ CSDN:SkyXZ--CSDN博客 博客园:SkyXZ - 博客园 宿主机环境:WSL2-Ubuntu22.04+Cuda12.6.D-Robotics-OE 1.2.8.Ubun ...
- 简单聊一下*SWITCH*交换机的作用
交换机 交换机工作在数据链路层的物理设备或者说是接入层的物理设备,转发数据帧. 随着企业网络的发展,越来越多的用户需要接入到网络,交换机提供的大量的接入端口能够很好地满足这种需求.同时,交换机也彻底解 ...
- C/C++ 以及 Rust 中的 getch() 实现
getch 是一个在 C 语言编程中常用的函数,用于从键盘读取一个字符,但不回显到屏幕上. 在 Windows 环境下,getch 实现通常包含在 <conio.h> 头文件中.需要注意的 ...
- 什么是Kappa架构?
一.简介 相当于在Lambda架构上去掉了批处理层(Batch Layer),只留下单独的流处理层(Speed Layer).通过消息队列的数据保留功能,来实现上游重放(回溯)能力. 当流任务发生代码 ...
- Flume概念和启动过程分析
一.概念 flume是一个分布式.可靠.和高可用的海量日志采集.聚合和传输的系统. Flume系统中核心的角色是agent,agent本身是一个Java进程,一般运行在日志收集节点. 一个agent内 ...