You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:48:37