【python】利用unrar解压缩加密的压缩包

1 概述

压缩解压的方法有多种,包括python有自带的库、zipfile库等。但都有些不足,自带库不能解压加密的压缩文件等。包括他们的解压时不能解压所有格式的压缩文件等。
例如:zipfile解压带密码时,要求压缩为存储类型。密码使用一般加密等。
而库unrar则没有这些限制,能与windows下的压缩rar文件等兼容,且解压速度很快!
unrar官方帮助文档:https://python-unrar.readthedocs.io/en/v0.3/

2 利用unrar解压缩

实践证明,使用该程序进行解压操作,效率是最高的。
示例:

from unrar import rarfile

f = rarfile.RarFile("test.rar")      # 传入rar文件路径
f.extractall(path='D:\\test\\')        # 传入存放解压rar文件的路径。解压所有文件到D:\test文件夹下下。如果没有path=...的设置,默认解压缩到程序工作目录下

f.extractall('D:\\test\\',pwd='123') 	#解压加密的压缩包,密码为123.这里用字符串就行

f.extract('A.txt',pwd='123',path='D:\\test\\')	#解压其中的一个文件A.txt,密码为123.另存到D:\test文件夹下。指定的解压缩文件名称,必须是其中的文件名,不能带路径等

注意:rarfile.RarFile(“test.rar”)中传入的文件名,只要求文件本身为rar即可。实际可以重命名为任意其他后缀都行。比如test.jpg,test.bin等。

在运行以上代码前,需要做两个工作:

2.1 安装unrar库

方法:pip install unrar。

2.2 配置unrar.dll库

如果只执行了pip install unrar的安装,没有设置unrar.dll库的话,运行上述代码会出现错误,提示:Couldn’t find path to unrar library…
在介绍方法前,先介绍下原理:在unrarlib.py(“python安装目录\Python27\Lib\site-packages\unrar”)中有实现:


lib_path = os.environ.get('UNRAR_LIB_PATH',None)	#默认从环境变量中获取该dll的路径
unrarlib = None
if platform.system() == 'Windows':	#针对windows系统
    from ctypes.wintypes import HANDLE as WIN_HANDLE
    HANDLE = WIN_HANDLE
    UNRARCALLBACK = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint,
                                       ctypes.c_long, ctypes.c_long,
                                       ctypes.c_long)
    lib_path = lib_path or find_library("unrar.dll")	#从环境变量获取或者搜索unrar.dll,会遍历当前工作目录,windows,windows32,环境变量path的各路径等
    if lib_path:	#如果找到,则加载
        unrarlib = ctypes.WinDLL(lib_path)
else:
    # assume unix
    HANDLE = ctypes.c_void_p
    UNRARCALLBACK = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_uint,
                                     ctypes.c_long, ctypes.c_long,
                                     ctypes.c_long)
    lib_path = lib_path or find_library("unrar")
    if lib_path:
        unrarlib = ctypes.cdll.LoadLibrary(lib_path)

从上代码可知,默认从环境变量UNRAR_LIB_PATH中获取。
之后针对windows和其他操作系统进行了区别对待。
如果是windows,则会从环境变量和搜索处理,如果找到则加载该dll。如果找不到,则会报错误:Couldn’t find path to unrar library…
(1)方法1:安装包,设置环境变量
方法可以参考【1】https://blogs.v8jisu.cn/it/2280.html
1). 先到RARLab官方下载库文件,http://www.rarlab.com/rar/UnRARDLL.exe ,(如果下传不了,到我的这个资源下传也行https://download.csdn.net/download/kevinshift/75314201)然后安装;
2). 安装最好选择默认路径,一般在 C:\Program Files (x86)\UnrarDLL\ 目录下;
3). 设置环境变量:
64位windows:UNRAR_LIB_PATH = C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll
32位windows:UNRAR_LIB_PATH = C:\Program Files (x86)\UnrarDLL\UnRAR.dll

注意:
1)这里需要注意操作系统的位数,32和64位区别设置。
2)从上面原理可以知道,默认搜索的是unrar.dll,但是64位的需要用到unrar64.dll。所以,如果没有设置环境变量,断然是无法找到unrar64.dll的!
3)环境变量设置的不是路径,而是到了具体的dll名字,这与一般的设置path路径不相同!!
4)基于3)的原因,UnRAR64.dll文件的名字也可以更改,更改后,只需要在环境变量中将其和环境变量中声明的文件名一致即可。
5)设置完环境变量后,需要重启电脑才能生效

(2)方法2:找到dll放到任意位置,并设置环境变量
本质上,只用到了UnRAR64.dll文件,所以理论上来说不需要安装UnRARDLL.exe程序,只需要有UnRAR64.dll文件,且将其设置到环境变量即可。

(3) 方法3:将需要的dll,放置到python程序的工作目录下
注意:如果是64位的,需要将unrar64.dll改名字为unrar.dll。ps:因为上面搜索时按照unrar.dll搜索的。

(4) 方法4:更改unrarlib.py中处理逻辑
如上面介绍的那段代码,可以将其改写下,改成自己的逻辑,保证其能搜索到。当然这个方法带有很强的定制味道,一般特殊用处使用这个。示例:

if platform.system() == 'Windows':
    from ctypes.wintypes import HANDLE as WIN_HANDLE
    HANDLE = WIN_HANDLE
    UNRARCALLBACK = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint,
                                       ctypes.c_long, ctypes.c_long,
                                       ctypes.c_long)
    lib_path = lib_path or find_library("unrar.dll")

    #下面定制了下,可以用绝对路径,相对路径,更改名字等。但这里的只是一个特殊的示例而已,有极强的定制性,不具有通用性!
    if lib_path is None:
        #lib_path = 'E:\\code\\python\\unrar\\Python27\\Lib\\site-packages\\unrar\\UnRAR.dll'
        #lib_path = 'lib\\UnRAR64.dll'
        lib_path = 'UnRAR64.dll'
        
    if lib_path:
        unrarlib = ctypes.WinDLL(lib_path)

参考:
【1】https://blogs.v8jisu.cn/it/2280.html
【2】https://www.cnblogs.com/yanghaizhou/p/5635541.html

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值