1 操作压缩文件


1.1 打开/创建 zip文件(Zipefile)

使用起来类似于 File 对象,所以处理压缩文件的第一步。

打开文件并返回file对象给变量
python # 导入zipfile模块 import zipfile # 打开zip文件 # zipfile.ZipFile(zip名, 访问模式, 压缩方式, 文件可否大于2G, 压缩级别) zf = zipfile.ZipFile('test1.zip', 'w') + 压缩方式有:ZIP_STORED(无压缩),ZIP_DEFLATED(zlib),ZIP_BZIP2(bz2) , ZIP_LZMA(lzma)。(没用过,不总结) python # zipfile.ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=True,compresslevel=None)
访问模式 只读 只写 读写
代码 r[默认] w a
文件不存在 报错 新建文件 新建文件
写入方式 不可写 重写 添加
+ 压缩级别:没用过,不总结。 + 访问模式还有:'x'。暂未接触过,不总结。

1.2 写入压缩文件(write)

1.2.1 覆盖式/追加式写入

覆盖式写入 — Zipfile(‘w’)
python # 导入zipfile模块 import zipfile import os # 准备要压缩的文件夹 def folder_create(folder_name): if not os.path.exists(folder_name): os.mkdir(folder_name) f1 = open(folder_name + '/a1.txt','w') f1.close() f2 = open(folder_name + '/a2.txt','w') f2.close() folder_create('test') folder_create('test/test') # 读取zip文件 zf1 = zipfile.ZipFile('test1.zip','w') # 覆盖式压缩 for i in range(2): zf1.write('test/a1.txt') print(zf1.namelist()) zf1.close() python # 之后示例会再调用此函数 # 'a'会重置原来的'test1.zip'(重命则存在两个同名文本) # 运行两次结果一致 # 重置原来的'test1.zip' # 将已存在的'test/a1.txt'写入 ['test/a1.txt'] ['test/a1.txt']
追加式写入— Zipfile(‘a’)
python # 导入zipfile模块 import zipfile import os # 准备要压缩的文件夹 folder_create('test2') folder_create('test2/test2') # 读取zip文件 zf1 = zipfile.ZipFile('test2.zip','a') # 追加式写入 for i in range(2): zf1.write('test2/a1.txt') print(zf1.namelist()) zf1.close() python # 'a'会重置原来的'test1.zip'(重命则存在两个同名文本) # 将已存在的'test/a1.txt'写入 ['test2/a1.txt'] ['test2/a1.txt', 'test2/a1.txt'] # 关闭文件夹

1.2.2 单/单层/多层文件写入

单文件压缩 — 直接 Write
python # 导入zipfile模块 import zipfile import os # 准备要压缩的文件夹 folder_create('test') folder_create('test/test') # 单文件压缩 zf1 = zipfile.ZipFile('test1.zip','w') zf1.write('test/a1.txt') zf1.close() python # 单一文件及工作路径的相对路径
文件夹单层压缩 — os.listdir 遍历
python # 导入zipfile模块 import zipfile import os # 准备要压缩的文件夹 folder_create('test') folder_create('test/test') # 文件夹单层压缩 zf2 = zipfile.ZipFile('test2.zip','a') for filename in os.listdir('test'): zf2.write('test/' + filename) zf2.close() python # 单层文件及工作路径的相对路径 # 历遍文件夹内所有文件和目录
文件夹多层压缩 — os.walk 遍历
python # 导入zipfile模块 import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 准备要压缩的文件夹 folder_create('test') folder_create('test/test') # 文件夹多层压缩 zf3 = zipfile.ZipFile('test3.zip','a') for root, dirs, files in os.walk('test'): for file in files: zf3.write(os.path.join(root, file)) zf3.close() python # 'r'为缺省值 # 多层文件及工作路径的相对路径 # 向后面示例以此为前提

1.3 设置密码(setpassword)

解压缩 zip 中某文件
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 设置密码 -- 错误示范 z1.setpassword('abc123') # 设置密码 -- 正确示范 z1.setpassword('abc123'.encode('ascii')) z1.close() python # 密码格式应使用 bytes 格式 报错:TypeError: pwd: expected bytes, got str

1.4 解压缩(extract extractall)

解压缩 zip 中某文件
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 单文件解压(参三可省) # z1.extract(被解压缩的文件名,保存的路径,密码) z1.extract('test/a1.txt','t','abc123'.encode('ascii')) z1.close() python # 其中,'r'为缺省值 # 参数二的目录不存在会自动新建 # z1.extract(member, path=None, pwd=None)
解压缩 zip 中多文件
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 多文件解压(参二三可省) # z1.extractall(保存的路径,被解压缩的文件名,密码) z1.extractall('t2',pwd='abc123'.encode('ascii')) z1.close() python # 参数一的目录不存在会自动新建 # z1.extractall(path=None, members=None, pwd=None) # 因为密码为参数三,所以在参数一后想直接使用,需要写入参数名 pwd=

1.5 二进制读写(read writestr)

二进制写入 — writestr
python import zipfile z1 = zipfile.ZipFile('test3.zip','w') # 二进制写入 # z1.writestr(zf对象, bytes类型数据) z1.writestr('test/a1.txt','you niu B'.encode('ascii')) z1.close() python # 'w' 会重置zip文件,并添加含指定内容的文本;'a'会直接添加添加含指定内容的文本(重命则存在两个同名文本) # z1.writestr(zinfo_or_arcname, bytes) # 通常用str.encode('ascii')转换格式
二进制读取 — read
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 二进制读取 # z1.read(zip文件名,密码)(无密码则省) s = z1.read('test/a1.txt', 'abc123'.encode('ascii')) print(s) print(s.decode('utf-8')) z1.close() python # # z1.read(name[, pwd]) b'you niu B' # 返回结果为byte you niu B # 需 .decode 转换

2 压缩文件信息


2.1 文件列表(namelist)

文件列表 — namelist / Zipfile(‘r’)
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 查询压缩文件内所有文件名 z1.printdir() python # 其中,'r'为缺省值 ['test/a1.txt', 'test/a2.txt', 'test/test/a1.txt', 'test/test/a2.txt', 'test2/a1.txt', 'test2/a2.txt', 'test2/test2/a1.txt', 'test2/test2/a2.txt']

2.2 文件打印(printdir)

文件信息 — printdir
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 其中,'r'为缺省值 # 打印所有信息到控制台(此方法本身无返回值) z1.printdir() python File Name Modified Size test/a1.txt 2022-07-25 13:39:50 0 test/a2.txt 2022-07-25 13:39:50 0 test/test/a1.txt 2022-07-25 13:39:50 0 test/test/a2.txt 2022-07-25 13:39:50 0 test2/a1.txt 2022-07-25 13:39:50 0 test2/a2.txt 2022-07-25 13:39:50 0 test2/test2/a1.txt 2022-07-25 13:39:50 0 test2/test2/a2.txt 2022-07-25 13:39:50 0

2.3 文件信息

2.3.1 所有文件信息(infolist)

所有文件具体信息 — infolist / Zipfile(‘r’)
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 查询压缩文件内所有文件信息 info1 = z1.infolist() print(type(info1)) print(info1) # 进一步提取 for info1 in infos1: print(info1.filename,';压缩前:' and info1.file_size,';压缩后:' and info1.compress_size) python <class 'list'> [<ZipInfo filename='test/a1.txt' filemode='-rw-rw-rw-' file_size=0>, <ZipInfo filename='test/a2.txt' filemode='-rw-rw-rw-' file_size=0>, <ZipInfo filename='test/test/a1.txt' filemode='-rw-rw-rw-' file_size=0>, <ZipInfo filename='test/test/a2.txt' filemode='-rw-rw-rw-' file_size=0>, <ZipInfo filename='test2/a1.txt' filemode='-rw-rw-rw-' file_size=0>, <ZipInfo filename='test2/a2.txt' filemode='-rw-rw-rw-' file_size=0>, <ZipInfo filename='test2/test2/a1.txt' filemode='-rw-rw-rw-' file_size=0>, <ZipInfo filename='test2/test2/a2.txt' filemode='-rw-rw-rw-' file_size=0>] test/a1.txt;压缩前: 0;压缩后: 0 test/a2.txt;压缩前: 0;压缩后: 0 test/test/a1.txt;压缩前: 0;压缩后: 0 test/test/a2.txt;压缩前: 0;压缩后: 0 test2/a1.txt;压缩前: 0;压缩后: 0 test2/a2.txt;压缩前: 0;压缩后: 0 test2/test2/a1.txt;压缩前: 0;压缩后: 0 test2/test2/a2.txt;压缩前: 0;压缩后: 0

2.3.2 单一文件信息(getinfo)

单一文件具体信息 — getinfo / Zipfile(‘r’)
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') # 查询压缩文件内指定文件信息 info2 = z1.getinfo('test/a1.txt') print(type(info2)) print(info2) # 进一步提取 print(info2.filename) print(info2.file_size) print(info2.compress_size) python <class 'zipfile.ZipInfo'> <ZipInfo filename='test/a1.txt' filemode='-rw-rw-rw-' file_size=0> test/a1.txt # 文件名 0 # 压缩前大小 0 # 压缩后大小

2.3.3 进一步提取信息

可返回信息
python import zipfile z1 = zipfile.ZipFile('test3.zip','r') info = z1.getinfo('test/a1.txt') # 进一步提取 -- 有用信息 print(info.filename) print(info.file_size) print(info.compress_size) print(info.date_time) # 进一步提取 -- 感觉没啥用信息 print(info.compress_type) print(info.comment) print(info.create_system) print(info.create_version) print(info.reserved) print(info.flag_bits) print(info.volume) print(info.internal_attr) print(info.external_attr) print(info.header_offset) print(info.CRC) # 进一步提取 -- 用就报错信息 print(info.extr) print(info.extract_versio) python # infolist 和 getinfo 获得的对象皆可。前者是所有文件(2.3.1);后者是但已指定文件(2.3.2) test/a1.txt # 文件名称 9 # 压缩前大小 9 # 压缩后大小 (2022, 7, 26, 11, 18, 18)# 最后修改日期 0 # 压缩类型 b'' # 文档说明 0 # 创建系统 20 # 读建PKZIP版本 0 # 预留字段 0 # 标志位 0 # 文件头卷标 0 # 内部属性 25165824 # 外部属性 0 # 文件头偏移位 897513101 # 未压缩文件CRC-32 报错:AttributeError: # 扩展项数据 报错:AttributeError: # 读解PKZIP版本

3 dlc(未学习)


其他压缩文件处理方式
使用Python对压缩文件的处理-电子发烧友网 详解python解压压缩包的五种方法python脚本之家