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