如何基于文件名时间戳筛选指定时分区间内的文件
解决方案:实现多分钟区间的文件筛选
核心思路
放弃仅依赖glob的模式匹配(它仅适合固定单模式场景),改为先获取所有符合格式的文件,再通过时间戳筛选的方式,灵活处理连续分钟区间甚至跨午夜的情况。
具体实现代码
import glob import re def get_files_between(starttime, endtime): # 用正则匹配文件名中的HHMMSS时间戳部分(格式:_6位数字.) timestamp_pattern = re.compile(r'_(\d{6})\.') # 获取当前目录下所有文件 all_files = glob.glob("*.*") matched_files = [] for file in all_files: # 提取文件名中的时间戳片段 match_result = timestamp_pattern.search(file) if not match_result: continue # 跳过不符合命名格式的文件 timestamp = match_result.group(1) file_hhmm = timestamp[:4] # 截取时分部分(HHMM) # 判断时分是否在目标区间内 if starttime <= endtime: # 常规区间(比如0801到0805) if starttime <= file_hhmm <= endtime: matched_files.append(file) else: # 跨午夜区间(比如2359到0002) if file_hhmm >= starttime or file_hhmm <= endtime: matched_files.append(file) return matched_files
关键细节说明
- 时间戳提取:用正则表达式
_(\d{6})\.精准匹配文件名中的_HHMMSS.片段,避免因文件名含多个下划线导致的分割错误。 - 区间判断逻辑:
- 当
starttime <= endtime时,直接判断文件的时分字符串是否处于两者之间(字符串按字典序比较,与数字顺序一致)。 - 当
starttime > endtime时(跨午夜场景),只要文件时分大于等于starttime,或小于等于endtime,都属于目标区间。
- 当
- 兼容性:无需预先知道区间内的所有分钟值,不管是连续10分钟还是跨小时的区间,逻辑都能统一处理。
对比原glob单分钟方案的优势
原方案用glob.glob("*_0801*.txt")匹配单分钟文件,扩展到多分钟时需要生成多个glob模式(如0801到0805要写5个模式),代码繁琐且无法处理跨午夜场景;而筛选式方案仅需一次遍历,逻辑简洁且覆盖所有边界情况。
内容的提问来源于stack exchange,提问作者Oblomov
相关产品推荐
相关产品推荐

