使用zipfile/rarfile/py7zr检测归档损坏的异常汇总
归档文件完整性检测:各Python库损坏相关异常整理
背景
从NexusMods下载了424个总大小21.576GiB的文件,因非高级用户受限速,平均下载速度1MiB/s,耗时超6小时,通过自制Python脚本批量下载。
下载链接生成核心代码如下:
import contextlib import json import requests from socket import gaierror from requests import RequestException from urllib3.exceptions import HTTPError DOWNLOAD_LINK_GENERATOR = ( "https://www.nexusmods.com/Core/Libs/Common/Managers/Downloads?GenerateDownloadUrl" ) while True: with contextlib.suppress( RequestException, HTTPError, gaierror, TimeoutError ): url = json.loads(requests.post( url=DOWNLOAD_LINK_GENERATOR, data={"fid": file_id, "game_id": game_id}, headers=HEADERS, cookies=COOKIES, timeout=1, ).content)["url"]
注:COOKIES和HEADERS为从文件加载的常量,file_id和game_id是NexusMods的文件与游戏ID。文件通过requests.get(url, stream=True)下载,此前使用aiohttp、asyncio、aiofiles实现多协程分块下载,因突发问题改用单线程方式。
受网络环境及NexusMods服务性能下降影响,下载过程易受干扰,且重写代码时移除了大量校验机制,因此怀疑部分文件损坏。所有文件均为.zip、.rar或.7z格式(部分.dazip为重命名的.zip),已通过代码验证魔数:zip文件为b'PK\x03\x04',7z为b"7z\xbc\xaf'\x1c",rar为b'Rar!\x1a\x07'。计划用Python异步批量提取文件,但因归档结构混乱、存在冗余文件,需自行编写代码实现精准控制,因此需提前检测文件完整性。
各库损坏相关异常汇总
使用rarfile.RarFile、py7zr.SevenZipFile、zipfile.ZipFile分别处理对应格式,通过testrar()、test()、testzip()方法检测完整性,完好归档无返回值,损坏归档触发的相关异常如下:
rarfile库
- 当文件损坏(如修改文件长度)时,调用
testrar()会抛出rarfile.BadRarFile异常,提示通常为"read failed"或"Corrupt file"。
py7zr库
- 当文件长度被修改时,初始化
SevenZipFile对象会直接抛出py7zr.Bad7zFile异常; - 文件长度未修改但内容损坏时,调用
test()无返回,但调用testzip()会抛出LZMAError: Corrupt input data异常。
zipfile库
- 当文件长度被修改时,调用
testzip()会抛出OSError异常; - 文件长度未修改但内容损坏时,存在两种情况:
- 返回损坏的文件名;
- 抛出解压缩相关异常(如
zipfile.LZMAError、zipfile.BadZipFile等)。
内容的提问来源于stack exchange,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

