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为密码
Python 本身不支持 rar 文件的解压,需要先安装相关依赖才可使用
pip3 install rarfile 安装rarfile库
(注意是解压,压缩这个方法不支持)
#coding=utf-8
import rarfile
path = "E:\\New\\New.rar"
path2 = "E:\\New"
rf = rarfile.RarFile(path) #待解压文件
rf.extractall(path2) #解压指定文件路径
rf.extractall(path2,pwd=password) #指定密码
rf.close()
压缩包中存在多个文件时,可以使用for循环进行批量解压
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,默认为当前目录
当上述方法无效时,可以采用os.system执行cmd命令的方式,调用winrar来进行解压。以下是递归解压文件夹实例
import os
import shutil
# 解压缩rar到指定文件夹
# def extractRar(zfile, path, pwd):
# # rar_command1 = "C:\Program Files\WinRAR\WinRAR.exe x -ibck %s %s -p%s" % (zfile, path)
# # rar_command2 = r'"C:\Program Files\WinRAR\WinRAR.exe" x -ibck %s %s -p%s' % (zfile, path, pwd)
# os.system(rar_command2)
# extractRar('flag.rar', '', '-')
path = '.'
filename = 'flag.rar'
passwd = '-'
desdir = '.'
def unrarfile(path, zfile, passwd):
# 拼装目标文件
filePath = os.path.join(path, zfile)
# for fp in os.listdir(path):
# if fp[-3:] == 'rar':
# 执行解压命令
rar_command2 = r'"C:\Program Files\WinRAR\WinRAR.exe" x -ibck %s %s -p%s' % (filePath, desdir, passwd)
r = os.system(rar_command2)
print(r)
# 递归删除解压出来的文件夹
if path != '.':
print(path)
shutil.rmtree(path)
# 查询最新解压出来的文件夹,及其内部文件
for fp2 in os.listdir(desdir):
if os.path.isdir(fp2):
# 文件夹名称就是密码
passwd = fp2
# print(passwd)
# 拼装新的目标文件夹
path = os.path.join(desdir,passwd)
# 读取新的目标文件
zfile = os.listdir(path)[0]
# 递归解压
unrarfile(path,zfile,passwd)
unrarfile(path,filename, passwd)