常用的几个类

# 判断是不是zip文件
zipfile.is_zipfile

# zip文件的读写操作
zipfile.ZipFile

# zip文件的信息
zipfile.ZipInfo


zipfile.ZipFile类

zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True)

# 参数

file            # 文件路径

mode            # 默认读取,和open一样
                # r     只读
                # w     覆盖重写
                # a     追加,不删除原来的文件
                # x     没弄清楚

compression     # 写入时的压缩方法
allowZip64      # 压缩包大于4G,默认是True
compresslevel   # 压缩等级  0-9


ZipFile可以使用上下文管理器,with关键字

# 创建test.zip 并写入 test.txt
with ZipFile('test.zip', 'w') as myzip:
    myzip.write('test.txt')


ZipFile的写操作

import os
from zipfile import ZipFile


# 创建test.zip 并写入 test.txt
with ZipFile('test.zip', 'w') as myzip:

    # 创建写入的文件
    with open('test.txt', 'w') as f:
        f.write('test')

    # 写入 test.txt 文件
    myzip.write('test.txt')

    # 写入 test.txt 文件并重命名为 test2.txt
    myzip.write('test.txt', 'test2.txt')

    # 使用 writestr 方法写入 test3.txt 文件
    myzip.writestr('test3.txt', 'test3')

    #  写入一个目录
    py = [os.path.join(root, file)
          for root, dirs, files in os.walk(r"py")
          for file in files]
    list(map(myzip.write, py))   # 高级函数map

    # 直接写入文件
    with myzip.open('zip/zip.txt', 'w') as f:
        # 写入的文件需要是字节流,不是字符串
        f.write(b"zip")

    # 查看创建好的zip文件结构
    myzip.printdir()

image-20200620182827468


ZipFile的读操作

with ZipFile(r'test.zip') as myzip:

    # 解决文件名乱码问题
    # filename = '乱码1.txt'.encode('gbk').decode('cp437')
    filename = 'test.txt'

    # 文件列表和详细信息,  有点像 linux 的 ls -la 命令
    print('-'*100 + '\r\n' + 'printdir' + '\r\n')
    myzip.printdir()

    # 所有文件信息
    print('\r\n' + '-'*100 + '\r\n' + 'infolist' + '\r\n')
    print(myzip.infolist())

    # 获取单个文件信息
    print('\r\n' + '-'*100 + '\r\n' + 'getinfo' + '\r\n')
    print(myzip.getinfo(filename))

    # 文件列表
    print('\r\n' + '-'*100 + '\r\n' + 'namelist' + '\r\n')
    print([f for f in myzip.namelist()])
    # print([f.encode('cp437').decode('utf-8') for f in myzip.namelist()])

    # 读取文件
    print('\r\n' + '-'*100 + '\r\n' + 'myzip.open' + '\r\n')
    with myzip.open(filename) as myfile:
        print(myfile.read())

    # 提取单个文件
    print('\r\n' + '-'*100 + '\r\n' + 'extract' + '\r\n')
    print("解压:" + myzip.extract(filename, path="./zip/单"))

    # 提取所有文件
    print('\r\n' + '-'*100 + '\r\n' + 'extractall' + '\r\n')
    myzip.extractall("./zip")
    print('解压所有文件成功')


image-20200620183142819


解决中文乱码

简单来说就是先把文件名用encode编码成cp437字节流,再用 gbkutf-8 解码就解决了

import os

from zipfile import ZipFile, Path


# 创建test.zip 并写入 test.txt
with ZipFile('test.zip', 'w') as myzip:

    #  写入的目录列表
    py = [os.path.join(root, file)
          for root, dirs, files in os.walk(r"py")
          for file in files]

    # 写入的 arcname 值,也就是在zip里面的文件名
    pya = [os.path.join(root, file).encode('utf-8').decode('cp437')
          for root, dirs, files in os.walk(r"py")
          for file in files]

    # 创建 zip文件
    list(map(myzip.write, py, pya))   # 高级函数map

    # 查看创建好的zip文件结构
    myzip.printdir()


with ZipFile(r'test.zip') as myzip:
    # 文件列表
    print('\r\n' + '-'*100 + '\r\n' + 'namelist' + '\r\n')
    print([f.encode('cp437').decode('utf-8') for f in myzip.namelist()])

image-20200620183920529


ZipFile.open 方法

ZipFile.open(name, mode='r', pwd=None, *, force_zip64=False)

name                    # 打开的文件名
mode                    # 模式,分为 rw,默认 r
pwd                     # 解压时的密码,默认空
force_zip64             # 读取大于 2G 的文件是需要设置成 True


没有详细学习的

# 方法
ZipFile.testzip()
ZipFile.close()


# 属性
ZipFile.filename            # 压缩包文件名
ZipFile.debug               # debug 等级 0-3 级
ZipFile.comment
ZipFile.setpassword         # 解压密码

path 类

class zipfile.Path('路径', at='')

Path.name                   # 最终的路径组成部分。
Path.open()                 # 
Path.iterdir()              # 枚举当前目录的子目录。
Path.is_dir()               # 判断是不是目录
Path.is_file()              # 判断是不是文件
Path.exists()               # 如果当前上下文引用了 zip 文件内的一个文件或目录则返回 True。
Path.read_text()            # 读取当前文件为 unicode 文本
Path.read_bytes()           # 字符串


filezip 的命令行

# 压缩文件
python -m zipfile -c test.zip file1 file2

# 压缩目录
python -m zipfile -c test.zip file/

# 解压
python -m zipfile -e test.zip file/

# 显示压缩包里的文件
python -m zipfile -l test.zip

选项

-l      # 显示压缩包里的文件
-c      # 压缩
-e      # 解压
-t      # 检查是否是 zip


关于zipfile 模块的延伸

还可以使用这个模块爆破压缩包密码,和crc校验的爆破,但是由于是python本身实现的功能,所以性能上会很差不推荐


参考

https://docs.python.org/zh-cn/3/library/zipfile.html




0
最后修改日期:2020年7月5日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。