You need to enable JavaScript to run this app. Windows 10下Python批量解压gz文件并保留包内原始文件名与扩展名
优惠活动
大模型
产品
解决方案
定价
更多

Windows 10下Python批量解压gz文件并保留包内原始文件名与扩展名

批量解压C盘指定路径GZ文件(完全匹配内部原始文件名实现)

核心实现逻辑

  • 全程依赖Python标准库实现,无需安装任何第三方依赖,兼容Windows 10环境下所有Python3.6以上版本
  • 文件名获取完全读取GZ压缩包头部存储的源文件元数据,完全不受外部GZ文件的命名规则影响,不会通过拆分外部文件名猜测内部名称,从根源上匹配“不修改原始文件名”的需求
  • 自动处理历史GZ包可能存在的路径冗余、重名覆盖问题,所有解压结果统一输出到指定目录,不生成嵌套子文件夹
  • 大文件采用流式读写,不会因为压缩包体积过大占用过高内存

代码中读取的gz_stream._member_name是Python gzip模块解析GZ规范头部的原生字段,对应压缩包创建时写入的原始源文件名,和外部文件命名完全独立,哪怕外部GZ文件被重命名为任意字符串,只要压缩包本身符合GZ格式,这个字段都会正确返回内部存储的真实文件名。

可直接运行的代码

import os
import gzip
import shutil

# 配置固定路径
SOURCE_GZ_DIR = r"C:\Xiang"
OUTPUT_UNZIP_DIR = r"C:\UnZipGz"

# 自动创建输出目录,避免路径不存在报错
os.makedirs(OUTPUT_UNZIP_DIR, exist_ok=True)

# 遍历扫描源目录下所有GZ文件
for entry in os.scandir(SOURCE_GZ_DIR):
    # 跳过非文件、非.gz后缀的条目
    if not entry.is_file(follow_symlinks=False):
        continue
    if not entry.name.lower().endswith(".gz"):
        continue

    # 打开GZ压缩包读取内容
    with gzip.open(entry.path, "rb") as gz_stream:
        # 读取GZ包内部存储的真实原始文件名(不受外部命名影响)
        inner_original_name = gz_stream._member_name

        # 兼容无内部文件名标记的异常GZ包:降级使用外部文件名去掉.gz后缀
        if not inner_original_name:
            inner_original_name = os.path.splitext(entry.name)[0]
        
        # 剥离内部文件名中携带的历史路径,仅保留纯文件名,避免生成嵌套子目录
        pure_filename = os.path.basename(inner_original_name)
        target_output_path = os.path.join(OUTPUT_UNZIP_DIR, pure_filename)

        # 处理重名文件:自动加序号后缀,避免覆盖已有文件
        file_base, file_ext = os.path.splitext(pure_filename)
        conflict_counter = 1
        while os.path.exists(target_output_path):
            target_output_path = os.path.join(
                OUTPUT_UNZIP_DIR,
                f"{file_base}({conflict_counter}){file_ext}"
            )
            conflict_counter += 1

        # 流式写入解压后的文件,适配大文件场景
        with open(target_output_path, "wb") as output_file:
            shutil.copyfileobj(gz_stream, output_file)

print("所有GZ文件解压完成")

运行注意事项

  • 执行前请确认当前Windows用户对C:\Xiang、C:\UnZipGz两个目录有读写权限,避免权限不足报错
  • 代码默认仅扫描C:\Xiang根目录下的GZ文件,如果需要递归扫描所有子目录下的GZ文件,可将遍历逻辑替换为os.walk实现
  • 对于少数非标准生成、未在头部写入原始文件名的GZ包,代码会自动降级使用外部文件名去掉.gz后缀作为解压后文件名,不会出现解压报错的情况

内容的提问来源于stack exchange,提问作者XYZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 04:24:05