# 介绍:复制全文,修改路径和密码,实现批量解压zip或rar压缩包,按给定的多个密码进行验证,并对解压后文件按顺序重命名
import os
import re
import zipfile
import rarfile
# 设定参数
path_in='C:\\your_path_1\\...' # 要解压的压缩包所在路径
path_out='C:\\your_path_2\\...' # 解压后文件存放的路径
pwd_list=['pwd1','pwd2','pwd3','pwd4'] # 如有多个密码,按数组方式填入
# 解压rar文件
def un_rar_file(file_name,path_out,pwd,i):
rar_file = rarfile.RarFile(file_name)
for names in rar_file.namelist(): # 遍历压缩包内文件名称
rar_file.extract(names,path_out,pwd) # 解压文件名、解压后路径、密码
os.rename(path_out+names,path_out+str(i)+'、'+names,) #重命名解压后文件,文件名开头加上数字序号
rar_file.close()
# 解压zip文件
def un_zip_file(file_name,path_out,pwd,i):
zip_file = zipfile.ZipFile(file_name)
for names in zip_file.namelist():
# zip解压库的密码需要转码为gbk
zip_file.extract(names,path_out,(pwd).encode('gbk'))
os.rename(path_out+names,path_out+str(i)+'、'+names,)
zip_file.close()
# 主函数入口
if __name__ == "__main__":
dire=os.walk(path_in) # 对象:该路径下所有文件和子文件夹文件
# file_name_list = os.listdir(path) # 另一种方式:扫描目标路径的文件,将文件名存入列表
for items in dire: # 遍历该文件夹
file_name_list=items[-1] # [-1]为文件名list,[0]路径,[1]文件夹,[2]也是[-1]是文件名
i=0
for file_name in file_name_list: # 遍历文件名,文件顺序i。
i=i+1
for pwd in pwd_list: # 遍历密码
try:
if file_name.split('.')[-1]=='rar': # 如果压缩文件是rar类型
un_rar_file(path_in+file_name,path_out,pwd,i) # 调用解压函数
elif file_name.split('.')[-1]=='zip':
un_zip_file(path_in+file_name,path_out,pwd,i)
else:
print(str(i)+'、*** '+file_name + ' is not a zip or rar file !')
break # 如果不是压缩文件,直接跳出该循环
# 如果解压出错(假定是密码错误)
except Exception as e:
# print(e)
print(str(i)+'、*** passwd:"'+pwd+' is error for file:'+file_name+',try another passwd !')
else:
print(str(i)+'、passwd:"'+pwd+'" is correct for file:'+file_name)
break # 如果正常解压,直接跳出该循环,不再尝试其他密码
# 备注:
# 1、解决rar找不到Unrar组件报错的问题
'''
# 下载UnRAR.exe放在主程序同级目录即可,下载地址:/rar/UnRARDLL.exe
'''
# 2、解决输出文件名中文乱码问题,修改组件 zipfile 的源码如下:
'''
if flags & 0x800:
# UTF-8 file names extension
filename = filename.decode('utf-8')
else:
# Historical ZIP filename encoding
filename = filename.decode('cp437')
# 增加如下一行
filename = filename.encode("cp437").decode('gbk')
if zinfo.flag_bits & 0x800:
# UTF-8 filename
fname_str = fname.decode("utf-8")
else:
fname_str = fname.decode("cp437")
# 增加如下又一行
fname_str = fname_str.encode("cp437").decode('gbk')
'''