压缩zipfile与解压缩tarfile模块

引入

  • shutil 对压缩包的处理实际上是调用了 ZipFileTarFile 这两个模块

一、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

252edfa067a65fa0b3acb4dd0265e6b

使用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”再来一次

    输出内容:解压成功~~

    🎄说明已经解压成功了。