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(未学习)