Python如何判断文件是zip还是tar.gz并执行对应解压操作
问题背景
需要实现自动判断压缩包格式,对zip格式执行解压、对tar.gz格式执行解包的逻辑,原有代码运行未达到预期效果。
原有代码核心问题
- 变量引用顺序错误:首次给
target_path赋值时,接口请求还未发起、primresult变量尚未定义,属于提前引用无效变量 - 语法错误:初始行
download_url = https:github.com/sergi/go-diff/archive/refs/tags/v1.2.0.zip的链接值未加字符串引号,不符合Python语法规范 - 函数传参错误:调用
process_archive()时传入的是字符串常量'download_url',不是存储实际下载链接的变量,导致后缀判断逻辑完全失效 - 文件写入逻辑缺陷:stream模式下直接用
resp.raw.read()可能出现内容截断,导致下载的压缩包损坏 - 缺少异常校验:没有判断本地文件是否存在、压缩包格式是否合法,遇到异常场景会直接崩溃
- 资源泄漏风险:手动调用
close()的逻辑如果中途抛错,会导致文件句柄无法正常释放
修复后可直接运行的代码
import os import json import tarfile import zipfile import requests from requests.auth import HTTPBasicAuth # 替换为实际使用的prim编号 primNumber = "替换为你的实际prim值" # 请求组件查询接口 primQueryURL = requests.get( f'http://example.com?query={{"username":"xxxxx","token":"xxxxxx","facility":"COMPONENT_QUERY", "prim":"{primNumber}"}}', timeout=10, headers={"Content-Type": "application/json"} ) primresult = json.loads(primQueryURL.text) download_url = primresult['download_url'] source_url = primresult['source_code_url'] target_path = download_url.split("/")[-1] print(f"压缩包将保存为:{target_path}") # 下载压缩包 resp = requests.get(source_url, stream=True, auth=HTTPBasicAuth('xxxx', 'xxxxx')) if resp.status_code != 200: raise RuntimeError(f"压缩包下载失败,HTTP状态码:{resp.status_code}") with open(target_path, 'wb') as f: # 分块写入,避免大文件读取不全、内存占用过高 for chunk in resp.iter_content(chunk_size=8192): if chunk: f.write(chunk) # 压缩包处理函数 def process_archive(file_path): if not os.path.isfile(file_path): raise FileNotFoundError(f"待处理文件不存在:{file_path}") # 优先匹配.tar.gz后缀,避免格式判断冲突 if file_path.endswith('.tar.gz'): with tarfile.open(file_path, 'r:gz') as tar: tar.extractall() print(f"tar.gz格式包 {file_path} 解包完成") elif file_path.endswith('.zip'): with zipfile.ZipFile(file_path, 'r') as zip_ref: zip_ref.extractall() print(f"zip格式包 {file_path} 解压完成") else: raise ValueError(f"暂不支持的压缩格式:{file_path}") # 传入本地文件路径执行处理 process_archive(target_path)
关键修改点说明
- 调整变量定义顺序:在拿到接口返回结果、解析出
primresult后再初始化target_path,避免提前引用未定义变量 - 修正函数传参逻辑:直接传入实际存储本地文件路径的
target_path变量,保证后缀判断逻辑正常生效 - 优化文件下载逻辑:采用分块迭代写入的方式替代全量读取,避免压缩包下载损坏、内存占用过高的问题
- 增加异常校验:新增HTTP请求状态校验、本地文件存在性校验、不支持格式的错误提示
- 调整格式判断顺序:优先匹配
.tar.gz后缀,避免后缀匹配逻辑冲突 - 改用上下文管理器(
with语句)处理文件和压缩包IO,自动释放资源,避免文件句柄泄漏 - 补全了缺失的依赖导入,修正了原始代码中的字符串语法错误
内容的提问来源于stack exchange,提问作者Demo Demo
相关产品推荐
相关产品推荐

