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

Python判断文件是否为ZIP压缩包的3种常用方法

[复制链接]

708

主题

0

回帖

11

积分

管理员

积分
11
发表于 昨天 16:04 | 显示全部楼层 |阅读模式
方法 1:读取文件头部魔数(最推荐、精准,不依赖后缀)
ZIP 文件固定文件头标识:50 4B(十六进制),对应字节 b'PK'
所有标准 zip 文件开头两个字节都是 PK,哪怕后缀被篡改也能识别。

  1. def is_zip_file(file_path: str) -> bool:
  2.     try:
  3.         with open(file_path, 'rb') as f:
  4.             header = f.read(2)  # 读取前2字节
  5.         return header == b'PK'
  6.     except (FileNotFoundError, PermissionError):
  7.         # 文件不存在/无读取权限,判定不是zip
  8.         return False

  9. # 使用
  10. print(is_zip_file("test.zip"))
  11. print(is_zip_file("demo.txt"))
复制代码

方法 2:使用内置 zipfile 模块(官方标准,可顺带校验完整性)
尝试打开文件,无报错即为合法 zip 文件,可区分损坏的压缩包:

  1. import zipfile

  2. def is_zip_file(file_path: str) -> bool:
  3.     try:
  4.         with zipfile.ZipFile(file_path) as zf:
  5.             # 校验压缩包完整性
  6.             zf.testzip()
  7.         return True
  8.     except (zipfile.BadZipFile, FileNotFoundError, PermissionError):
  9.         return False
复制代码

优缺点:
✅ 能识别破损、无效 zip 包
❌ 相比读文件头速度稍慢
方法 3:仅判断文件后缀(不推荐,极易被篡改)
只看文件名结尾,修改后缀就能骗过判断:

  1. def is_zip_file_suffix(file_path: str) -> bool:
  2.     return file_path.lower().endswith((".zip", ".zipx"))
复制代码

补充边界场景
空文件:前 2 字节为空,会判定非 zip
分卷压缩包、加密 zip:头部依旧是 PK,两种方法均可识别
jar/apk 文件:本质都是 zip 格式,同样会被识别为 zip

组合实用写法(兼顾精准 + 容错)
优先文件头校验,再用 zipfile 二次核验:

  1. import zipfile

  2. def check_zip(filepath):
  3.     # 第一步校验文件头
  4.     try:
  5.         with open(filepath, "rb") as f:
  6.             if f.read(2) != b"PK":
  7.                 return False
  8.     except:
  9.         return False
  10.     # 第二步校验zip结构合法
  11.     try:
  12.         zipfile.ZipFile(filepath)
  13.         return True
  14.     except zipfile.BadZipFile:
  15.         return False
复制代码


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

本版积分规则

手机版|skypiea

GMT+8, 2026-7-29 06:34 , Processed in 0.041139 second(s), 19 queries .

Powered by skypiea

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