如何修改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
相关产品推荐
相关产品推荐

