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

如何修改os.walk代码仅返回.gz压缩包路径而非包内同名后缀文件

默认情况下os.walk只会遍历物理文件系统中的真实目录和文件,不会自动读取压缩包内部的内容,你现在同时拿到压缩包和包内.gz文件的路径,大概率是压缩包已被提前解压到当前遍历的labels/目录结构内,或是你将压缩包挂载为了系统可识别的虚拟目录。你可以根据自己的场景选择以下修改方案:

方案1:仅遍历labels根目录,不扫描子目录

如果你的所有目标.gz压缩包都直接放在labels/根目录下,子目录里的都是解压产生的文件,直接放弃递归遍历的os.walk即可:

import os
from pathlib import Path

labels = []
# 注意dir是Python内置函数名,不建议作为自定义变量使用,可修改为自定义名称比如root_dir
label_root = os.path.join(dir, 'labels/')
for file in os.listdir(label_root):
    file_full_path = os.path.join(label_root, file)
    # 仅匹配根目录下后缀为.gz的文件,排除子目录
    if os.path.isfile(file_full_path) and file.endswith('.gz'):
        labels.append(Path(file_full_path))

方案2:需要递归遍历子目录,跳过存放解压内容的目录

如果你需要扫描多层子目录下的压缩包,仅要排除存放解压文件的特定目录,可以在os.walk过程中过滤掉不需要的子目录:

import os
from pathlib import Path

labels = []
for path, dirs, files in os.walk(os.path.join(dir, 'labels/')):
    # 此处修改为你实际存放解压内容的目录名,遍历的时候会直接跳过这些目录
    dirs[:] = [d for d in dirs if d not in ['unpacked', 'extracted', 'gz_temp']]
    for file in files:
        if file.endswith('.gz'):
            # 替换原有的字符串拼接,用os.path.join适配不同系统的路径分隔符
            masks = Path(os.path.join(path, file))
            labels.append(masks)

方案3:增加gzip格式校验,避免误加非压缩包文件

如果担心有手动修改后缀名的非压缩.gz文件被误加入列表,可以增加gzip文件魔数校验逻辑:

import os
from pathlib import Path

def is_valid_gz(file_path):
    # 标准gzip文件的头部固定为两个字节的魔数:0x1f 0x8b
    if not os.path.isfile(file_path):
        return False
    with open(file_path, 'rb') as f:
        file_header = f.read(2)
    return file_header == b'\x1f\x8b'

labels = []
for path, dirs, files in os.walk(os.path.join(dir, 'labels/')):
    # 可按需开启目录过滤
    # dirs[:] = [d for d in dirs if d not in ['unpacked']]
    for file in files:
        if file.endswith('.gz'):
            full_path = os.path.join(path, file)
            if is_valid_gz(full_path):
                labels.append(Path(full_path))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:24:03