使用os.walk与正则表达式筛选指定DOY范围文件夹内的目标文件
优化实现方案
原来手动维护排除集合的方式适配性很差,一旦调整DOY起止范围就要重新生成排除列表,效率非常低。可以直接在遍历文件夹时动态提取DOY编号做区间判断,代码更简洁,适配性也更强。
优化后的代码如下:
import os import re from shutil import copy2 DOY_START = 109 DOY_END = 158 # 匹配文件名的正则可根据实际需求调整 file_regex = re.compile(r'(file1_regex\.txt)|file2_regex\.txt') # 匹配DOY格式文件夹名,提取后面的数字编号 doy_dir_regex = re.compile(r'^DOY(\d+)$') rootdir = "C:/Users/Inputs/..." output_dir = "C:/Users/Outputs/..." for root, dirs, files in os.walk(rootdir, topdown=True): # 只保留命名符合DOY格式、且编号在目标区间的文件夹 dirs[:] = [ d for d in dirs if (match_res := doy_dir_regex.match(d)) and DOY_START <= int(match_res.group(1)) <= DOY_END ] for file in files: if file_regex.match(file): full_file_path = os.path.join(root, file) copy2(full_file_path, output_dir)
核心改动说明
- 去掉了手动维护的排除集合,新增DOY文件夹名的匹配规则,自动提取编号做区间判断,后续调整处理范围时只需要修改
DOY_START和DOY_END两个变量即可 - 路径拼接改用
os.path.join,自动适配不同操作系统的路径分隔符,避免手动拼接斜杠出错的问题 - 如果你使用的是Python3.8以下版本,不支持海象运算符
:=,可以把文件夹过滤的列表推导式替换为兼容写法:
valid_dirs = [] for d in dirs: match_res = doy_dir_regex.match(d) if match_res and DOY_START <= int(match_res.group(1)) <= DOY_END: valid_dirs.append(d) dirs[:] = valid_dirs
内容的提问来源于stack exchange,提问作者Ted
相关产品推荐
相关产品推荐

