|
|
主要依靠内置标准库 zipfile,无需额外安装第三方包;可获取:文件名、大小、压缩后大小、修改时间、权限、是否文件夹、CRC 校验值等全部文件属性。
一、核心类:ZipInfo
压缩包里每一个文件 / 文件夹都会对应一个 ZipInfo 对象,所有属性都存在这个实例里。
二、常用可获取的文件属性清单
属性 含义
filename 压缩包内文件路径 / 名称
file_size 原始未压缩文件字节大小
compress_size 压缩后占用字节大小
date_time 文件最后修改时间 (元组:(年,月,日,时,分,秒))
compress_type 压缩算法编号(0 = 存储未压缩,8=DEFLATE 常规压缩)
CRC 文件 32 位 CRC 校验码
is_dir() 判断是否是文件夹,返回布尔值
external_attr 文件权限、系统属性(区分 Windows/Linux 权限)
三、完整示例代码
示例 1:遍历压缩包所有文件,打印全部属性
- import zipfile
- from datetime import datetime
- zip_path = "test.zip" # 你的zip文件路径
- with zipfile.ZipFile(zip_path, "r") as zf:
- # zf.infolist():获取压缩包内所有文件ZipInfo列表
- for info in zf.infolist():
- print("=" * 50)
- print(f"文件名称:{info.filename}")
- print(f"是否文件夹:{info.is_dir()}")
- print(f"原始大小:{info.file_size} 字节")
- print(f"压缩后大小:{info.compress_size} 字节")
- # 转换修改时间为可读日期
- modify_time = datetime(*info.date_time)
- print(f"最后修改时间:{modify_time}")
- print(f"压缩类型编码:{info.compress_type}")
- print(f"CRC校验值:{info.CRC}")
- print(f"外部属性(权限):{info.external_attr}")
复制代码
示例 2:获取指定单个文件的属性
- import zipfile
- with zipfile.ZipFile("test.zip", "r") as zf:
- # getinfo:精准获取某一个文件的属性
- file_info = zf.getinfo("doc.txt")
- print("文件大小:", file_info.file_size)
- print("修改时间:", file_info.date_time)
复制代码
四、拓展实用用法
1. 计算压缩率
- ratio = 1 - (info.compress_size / info.file_size) if info.file_size > 0 else 0
- print(f"压缩率:{ratio:.2%}")
复制代码
2. 解析 Linux 文件权限(unix 系统)
external_attr 高位存储 Linux 文件权限:
- if not info.is_dir():
- # 提取八进制文件权限
- mode = (info.external_attr >> 16) & 0o777
- print(f"Linux文件权限:{oct(mode)}")
复制代码
3. 只遍历文件,跳过文件夹
- for info in zf.infolist():
- if not info.is_dir():
- # 只处理普通文件
- pass
复制代码
五、补充说明
编码问题:压缩包中文名乱码时,打开 zip 指定编码:
- ZipFile(zip_path, "r", encoding="utf-8")
- # 旧版Windows压缩包常用:gbk编码
- ZipFile(zip_path, "r", encoding="gbk")
复制代码
大压缩包:infolist() 会一次性读取所有文件;需要迭代读取可用 zf.filelist
如需读取压缩包内部文件内容:可配合 zf.read(info.filename)
|
|