48 zipfile 与 tarfile 模块

130次阅读
没有评论

共计 1775 个字符,预计需要花费 5 分钟才能阅读完成。

引入

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

48 zipfile 与 tarfile 模块

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. 先准备一个密码库

48 zipfile 与 tarfile 模块

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

  • 我设置的密码 : 123

48 zipfile 与 tarfile 模块

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" 这个密码的, 所以第一次应该是不成功的

48 zipfile 与 tarfile 模块

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

48 zipfile 与 tarfile 模块

48 zipfile 与 tarfile 模块

可以发现已经解压成功了

48 zipfile 与 tarfile 模块

正文完
 
shawn
版权声明:本站原创文章,由 shawn 2023-06-16发表,共计1775字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)