【Python】Python实现解压rar文件

news/2024/10/5 21:22:12

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:returnelse: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 = 0for i in file_list:all_size += i.file_size# 解压unrar_size = 0for 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 efinally:rf.close()return True

代码中get_relative_path函数是通过相对路径获取绝对路径的函数,这个与本文无关就不贴出了,返回就是一个绝对路径。代码中logger是日志对象,相当于就是打印函数,可以改成print输出。代码中progress_fun函数是打印进度的函数,接受一个浮点数,代表进度,这个大家可以自己实现一下,也可以直接删除。

贰、参考文档

  • rarfile API documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/43924.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

QT210开发板学习(2): 通过DNW点亮LED灯

查找开发板原理图,可知可用的LED有4个, 引脚为EINT0/1/2/3, 对应的IO口则是GPH0_0/1/2/3, 寄存器有GPH0CON,GPH0DAT,GPH0PUD,GPH0DRV GPH0CON用来设置IO模式(地址为0xE0200C00), GPH0DAT是电平状态(地址为0xE0200C04) 我们需要设置为Output模式, 并且将状态设置为高电平 新建一…

wincc OPC UA无验证设置

打开项目下的OPC\UAServer文件夹,先复制OpcUaServerWinCC进行备份,再以记事本形式打开OpcUaServerWinCC,修改成下图红框2/3中的true和false即可无验证访问。注意:需授权 wincc Connectivity Pack(可不安装Connectivity连通性软件包)

log4net 在winfrom中的使用

1. 安装两个 nuget 包 2. 创建 log4net.config 文件 ,选中 文件鼠标右键,选择属性->复制到输出目录 修改为 始终复制<?xml version="1.0" encoding="utf-8" ?> <configuration><!--只保留创建日期是最近1天的--><log4net Overdu…

MySQL 5.7贴心参数之binlog_row_image=full

相信大家都了解mysql binlog的格式,那就是有三种,分别是STATEMENT,MiXED,ROW。各有优劣,具体的请大家自行查阅资料。在MySQL 5.7版本以前,虽然ROW格式有各种各样的好处。 1. 比如加快从库重放日志;ROW直接调用mysql的存储引擎接口(handler API) 来执行行的插入、删除和更新…

0-SpringBoot 内嵌 camunda

‍https://docs.camunda.org/manual/7.21/user-guide/spring-boot-integration/我的项目环境springboot :2.0.4.RELEASE​ jdk:1.8 多数据源 数据库:postgresql​引入依赖<dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>ca…

矩阵计算

梯度将导数拓展到向量将导数拓展到矩阵

Python如何离线安装第三方库?

大家好,我是Python进阶者。 一、前言 前几天在Python最强王者交流群【斌】问了一个Python第三方库离线下载的问题,问题如下:求教大佬,这个库(python-docx/),能下载下来吗?我是链接另存为,但是速度太慢? 二、实现过程 这里【莫生气】给了个思路如下:直接 pip 安装就可…

回车和换行

总算搞清楚"回车"和"换行"的来历和区别了在学计算机的时候,总是会遇到回车和换行,但一直没去深究;在学习字符编码相关知识的时候,觉得得深入去搞懂下,除了编码,在我们日常工作中也是经常会遇到的。 因此去网上查阅了相关博客,有了今天这篇文章。我们…