使用Python解压zip、rar文件
解压 zip 文件
基本解压操作
import zipfile ''' 基本格式:zipfile.ZipFile(filename[,mode[,compression[,allowZip64]]]) mode:可选 r,w,a 代表不同的打开文件的方式;r 只读;w 重写;a 添加 compression:指出这个 zipfile 用什么压缩方法,默认是 ZIP_STORED,另一种选择是 ZIP_DEFLATED; allowZip64:bool型变量,当设置为True时可以创建大于 2G 的 zip 文件,默认值 True; ''' zip_file = zipfile.ZipFile(path) zip_list = zip_file.namelist() # 得到压缩包里所有文件 for f in zip_list: zip_file.extract(f, folder_abs) # 循环解压文件到指定目录 zip_file.close() # 关闭文件,必须有,释放内存
其他方法
zipfile.is_zipfile('xxx.zip') # 判断文件是否是个有效的zipfile zipfile.namelist('xxx.zip') # 列表,存储zip文件中所有子文件的path(相对于zip文件包而言的) zipfile.infolist('xxx.zip') # 列表,存储每个zip文件中子文件的ZipInfo对象 zipfile.printdir() # 打印输出zip文件的目录结构,包括每个文件的path,修改时间和大小 zipfile.open(name[,mode[,pwd]]) # 获取一个子文件的文件对象,可以对其进行read,readline,write等操作 zipfile.setpassword(psw),为zip文件设置默认密码 zipfile.testzip() # 读取zip中的所有文件,验证他们的CRC校验和。返回第一个损坏文件的名称,如果所有文件都是完整的就返回None zipfile.write(filename[,arcname[,compression_type]]) # 将zip外的文件filename写入到名为arcname的子文件中(当然arcname也是带有相对zip包的路径的),打开方式为w或a zipfile.extract(member, path=None, pwd=None) # 解压一个zip中的文件,path为解压存储路径,pwd为密码 zipfile.extractall(path[,pwd]) # 解压zip中的所有文件,path为解压存储路径,pwd为密码
解压 rar 文件
Python 本身不支持 rar 文件的解压,需要先安装相关依赖才可使用
- 安装 unrar 模块:pip install unrar
- 下载安装 unrar library,网址:http://www.rarlab.com/rar/UnRARDLL.exe 按照默认安装路径安装
- 将安装后文件夹中的 X64 文件夹加入环境变量(默认路径为 C:\Program Files (x86)\UnrarDLL\x64)
- 系统变量中新建变量,变量名输入 UNRAR_LIB_PATH,变量值为 C:\Program Files (x86)\UnrarDLL\x64\UnRAR64.dll(32位系统下的变量值为C:\Program Files (x86)\UnrarDLL\UnRAR.dll)
- 将 winrar 的目录下的 unrar.exe 复制到 Python 路径的 Scripts 文件夹下
- 重启PyCharm
基本操作
rf = rarfile.RarFile(_rarfile, mode='r') # mode的值只能为'r' rf_list = rf.namelist() # 得到压缩包里所有的文件 print('rar文件内容', rf_list) for f in rf_list: rf.extract(f, folder_abs) # 循环解压,将文件解压到指定路径 # 一次性解压所有文件到指定目录 # rf.extractall(path) # 不传path,默认为当前目录
小案例
已知一个有密码的压缩包,但是忘了密码是多少,只记得密码是纯数字,用脚本轻松找回密码。
import rarfile,zipfile jy_path=r'D:\test\忘记密码的压缩包.zip' pwd_l = [str(i).encode('ascii') for i in range(1000000)] # 事先准备好密码,zipfile的pwd需要用bytes的数据类型 # 针对rar文件 def rar_attack(f): file_handle = rarfile.RarFile(f) for i in pwd_l: try: file_handle.extractall(path='ttt',pwd=i) print('Yes!,pwd=',i) break except Exception as e: print('No,',e,i) file_handle.close() # 针对zip文件 def zip_attack(f): file_handle = zipfile.ZipFile(f) for i in pwd_l: print(i) try: file_handle.extractall(path='ttt',pwd=i) # path用于给定解压后文件放置的路径 print('Yes!,pwd=', i) break except Exception as e: print('No,', e) file_handle.close() if __name__ == '__main__': zip_attack(jy_path)