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
相关产品推荐
相关产品推荐

