引入
-
shutil 对压缩包的处理实际上是调用了 ZipFile 与 TarFile 这两个模块
一、zipfile 模块
1.什么是 zipfile 模块
-
zipfile 模块是 Python里用来做 zip格式编码压缩和解压缩的工具, 所以这个模块也是比较常用的。
-
在Windows 中常见的就是 zip 格式的压缩包
2.zipfile.ZipFile类的使用
-
形参 mode 应当为
'r'
来读取一个存在的文件,'w'
来截断并写入新的文件,'a'
来添加到一个存在的文件。ZipFile 也是一个上下文管理器,也支持with
语句。 -
模块中 ZipFile 类的组要功能是创建和读取 zip 文件
import zipfile,os #压缩多个文件 z=zipfile.ZipFile("txx.zip","w") # 得到一个对象赋值给z z.write("./passdict.txt") # 将"passdict.txt"这个目录加入压缩包 z.write("./password.txt") # 将"password.txt"加入压缩包 z.close() # 关闭文件, 结束时必须要有 #解压多个文件 z = zipfile.ZipFile("txx.zip","r") z.extractall(path="./ccc") # 解压到 "./ccc" 中 z.close() print(os.listdir("./ccc")) # ['passdict.txt', 'password.txt']
3.解压解码zip文件
-
目前 zipfile 模块支持 zip 格式加密文件的解密, 但目前无法创建加密文件
-
并且解密文件目前只支持传统的加密算法: ZipCrypto, 其他不支持:AES-256
使用with语句:
with zipfile.ZipFile('2021123.zip', 'w') as f:
f.write('password.txt')
with zipfile.ZipFile('2021123.zip', 'r') as f:
f.extractall(path='./test', pwd='123'.encode('utf-8'))
4.字符串(str) 与字节(Bytes) 的转换
👼将字符串转"bytes" (也可以直接在字符串前面写一个小b)
st="123"
b=bytes(st,encoding="utf-8")
print(b,type(b)) #b'123' <class 'bytes'>
🥩将"bytes"转字符串
b = b'123'
str2 = b.decode("utf-8")
print(str2,type(str2)) #123 <class 'str'>
🍬将bytes转成字符串
b = b"123"
str3 = str(b,encoding="utf-8")
print(str3,type(str3)) # 123 <class 'str'>
二、tarfile模块
import tarfile,os
🚗压缩
t=tarfile.open("./low.tar","w")
t.add("./passdict.txt",arcname="passdict.bak") #将“passdict.txt”这个目录加入压缩包
t.add("./password.txt",arcname="password.bak") #将"password.txt”加入压缩包
t.close()
print(os.listdir("./")) #['2021123.zip', 'ccc', 'li.py', 'low.tar', 'packge.py', 'passdict.txt', 'password.txt', 'test', 'txx.zip']
🚚解压
t=tarfile.open("./low.tar","r")
t.extractall("./low") #解压到“./low"中
t.close()
print(os.listdir("./low")) #['passdict.bak', 'password.bak']
三、zip压缩包密码暴力破解
1.准备一个密码库
🎅pwd.lib文件内容如下:
12345679,1234567890,asdasdasd,abc123456,aa123456,10101010,xiaoxiao,qwe123456,taoxiaoxin,taoxiaoxin123,8848,123,123456,9999,8888
🥽设置OOS.zip文件密码为taoixaoxin123
2、编写循环对比程序
import zipfile
with open("pwd.lib","r") as lib:
li = lib.read().strip().split(",")
for pwasswd in li:
f=zipfile.ZipFile("./OSS.zip","r")
try:
f.extractall(".",pwd=bytes(pwasswd,encoding="utf-8"))
print("解压成功~~")
f.close()
break
except RuntimeError:
...
else:
print("没有匹配的密码,请重试~")
3.测试
-
第一次没有在密码库里放“taoxiaoxin123”,所以匹配不成功
输出内容:没有匹配的密码,请重试~
-
在密码库里面加入密码“taoxiaoxin123”再来一次
输出内容:解压成功~~
🎄说明已经解压成功了。