找回密码
 立即注册
搜索
到手67.99元!阿里云轻量2核2G云服务器
查看: 16|回复: 0

Python获取Zip压缩包内文件属性

[复制链接]

708

主题

0

回帖

11

积分

管理员

积分
11
发表于 昨天 16:24 | 显示全部楼层 |阅读模式
主要依靠内置标准库 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:遍历压缩包所有文件,打印全部属性

  1. import zipfile
  2. from datetime import datetime

  3. zip_path = "test.zip"  # 你的zip文件路径

  4. with zipfile.ZipFile(zip_path, "r") as zf:
  5.     # zf.infolist():获取压缩包内所有文件ZipInfo列表
  6.     for info in zf.infolist():
  7.         print("=" * 50)
  8.         print(f"文件名称:{info.filename}")
  9.         print(f"是否文件夹:{info.is_dir()}")
  10.         print(f"原始大小:{info.file_size} 字节")
  11.         print(f"压缩后大小:{info.compress_size} 字节")

  12.         # 转换修改时间为可读日期
  13.         modify_time = datetime(*info.date_time)
  14.         print(f"最后修改时间:{modify_time}")

  15.         print(f"压缩类型编码:{info.compress_type}")
  16.         print(f"CRC校验值:{info.CRC}")
  17.         print(f"外部属性(权限):{info.external_attr}")
复制代码

示例 2:获取指定单个文件的属性

  1. import zipfile

  2. with zipfile.ZipFile("test.zip", "r") as zf:
  3.     # getinfo:精准获取某一个文件的属性
  4.     file_info = zf.getinfo("doc.txt")
  5.     print("文件大小:", file_info.file_size)
  6.     print("修改时间:", file_info.date_time)
复制代码


四、拓展实用用法
1. 计算压缩率

  1. ratio = 1 - (info.compress_size / info.file_size) if info.file_size > 0 else 0
  2. print(f"压缩率:{ratio:.2%}")
复制代码

2. 解析 Linux 文件权限(unix 系统)
external_attr 高位存储 Linux 文件权限:

  1. if not info.is_dir():
  2.     # 提取八进制文件权限
  3.     mode = (info.external_attr >> 16) & 0o777
  4.     print(f"Linux文件权限:{oct(mode)}")
复制代码

3. 只遍历文件,跳过文件夹

  1. for info in zf.infolist():
  2.     if not info.is_dir():
  3.         # 只处理普通文件
  4.         pass
复制代码

五、补充说明
编码问题:压缩包中文名乱码时,打开 zip 指定编码:

  1. ZipFile(zip_path, "r", encoding="utf-8")
  2. # 旧版Windows压缩包常用:gbk编码
  3. ZipFile(zip_path, "r", encoding="gbk")
复制代码

大压缩包:infolist() 会一次性读取所有文件;需要迭代读取可用 zf.filelist
如需读取压缩包内部文件内容:可配合 zf.read(info.filename)




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|skypiea

GMT+8, 2026-7-29 06:39 , Processed in 0.043710 second(s), 20 queries .

Powered by skypiea

快速回复 返回顶部 返回列表