🍖zipfile 与 tarfile 模块

引入

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

一.zipfile 模块

1.什么是 zipfile 模块

  • zipfile 模块是 Python里用来做 zip格式编码压缩和解压缩的工具, 在Windows 中常见的就是 zip 格式的压缩包, 所以这个模块也是比较常用的

2.ZipFile 类的使用

  • 模块中 ZipFile 类的组要功能是创建和读取 zip 文件
import zipfile,os

🔰压缩
import zipfile

z = zipfile.ZipFile("shawn.zip","w") # 得到一个对象赋值给z
z.write("./bbb")            # 将"bbb"这个目录加入压缩包
z.write("./ttt.txt")        # 将"ttt.txt"加入压缩包
z.close()                   # 关闭文件, 结束时必须要有

print(os.listdir("./"))     # ['bbb', 'ccc', 'shawn.zip', 'ttt.txt']

🔰解压
z = zipfile.ZipFile("shawn.zip","r")
z.extractall(path="./ccc")  # 解压到 "./ccc" 中
z.close()

print(os.listdir("./ccc"))  # ['bbb', 'ttt.txt']

3.解压加密 zip 文件

  • 目前 zipfile 模块支持 zip 格式加密文件的解密, 但目前无法创建加密文件

  • 并且解密文件目前只支持传统的加密算法: ZipCrypto, 其他不支持:AES-256

import zipfile

f = zipfile.ZipFile("./ab.zip","r")
f.extractall(".",pwd=b"123")  # 填写解压的路径以及密码, 密码需转成Bytes类型
f.close()

4.字符串(str) 与字节(Bytes) 的转换

🍓将字符串转"bytes" (也可以直接在字符串前面写一个小b)
str1 = "123"
b = bytes(str1,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("./song.tar","w")
t.add("./bbb",arcname="bbb.bak")      # 将"bbb"这个目录加入压缩包
t.add("./ttt.txt",arcname="ttt.bak")  # # 将"ttt.txt"加入压缩包
t.close()

print(os.listdir("./"))     # ['bbb', 'ccc', 'song.tar', 'ttt.txt']

🔰解压
t = tarfile.open("./song.tar","r")
t.extractall("./ccc")       # 解压到 "./ccc" 中
t.close()

print(os.listdir("./ccc"))  # ['bbb.bak', 'ttt.bak']

三.zip压缩包密码暴力破解

1.先准备一个密码库

image-20210112181341082

2.准备一个zip压缩包, 使用的是传统算法加密的密码

  • 我设置的密码 : 123

image-20210112181810338

3.编写循环比对程序

import zipfile

with open("passwd.lib","r")as lib:
    li = lib.read().strip().split(",")
    for passwd in li:
        f = zipfile.ZipFile("./ab.zip","r")
        try:
            f.extractall(".",pwd=bytes(passwd,encoding="utf-8"))
            print("解压成功")
            f.close()
            break
        except RuntimeError:
            ...
    else:
        print("沒有匹配的密码")

4.测试

  • 我在密码库里是没有放 "123" 这个密码的, 所以第一次应该是不成功的

image-20210112181729454

  • 我们在密码库里边加入密码 "123" 再来一次

image-20210112181911428

image-20210112181927107

可以发现已经解压成功了

ceeb653ejw1f90iz3wj1sg204604675q

posted @ 2021-01-12 20:39  给你骨质唱疏松  阅读(165)  评论(0编辑  收藏  举报