如何用Python的glob库高效实现文件名多条件过滤?
解决Python glob多条件日期文件名过滤的问题
你的问题核心是误解了glob的通配符语法:glob里的[xxx]是单个字符的字符集匹配,不是范围匹配,比如[2022-2023]只会匹配2、0、-、3这些单个字符,完全达不到匹配2022/2023年份的效果,这才导致过滤范围出错。
针对你的需求,推荐两种高效的结构化方法:
方法一:先glob粗匹配,再用Python解析日期过滤(最通用)
先用glob获取所有符合基本格式的文件,再提取文件名中的日期信息,用datetime模块做精准判断,这种方法灵活易维护,适合大部分场景。
示例代码:
import glob from datetime import datetime folder_path = "..." # 先匹配所有带8位日期+A+4位时间的.pq文件 all_files = glob.glob(f"{folder_path}/*_????????A????.pq") filtered_files = [] for file in all_files: # 提取文件名中的8位日期部分(按你的文件名格式分割) date_str = file.split("_")[-1].split("A")[0] try: file_date = datetime.strptime(date_str, "%Y%m%d") # 判断条件:2022-2023年,1-6月,1-15日 if (2022 <= file_date.year <= 2023 and 1 <= file_date.month <=6 and 1 <= file_date.day <=15): filtered_files.append(file) except ValueError: # 跳过格式不符合的文件 continue print(filtered_files)
如果文件名格式有变化,也可以用正则表达式提取日期:
import re pattern = re.compile(r'(\d{8})A') for file in all_files: match = pattern.search(file) if match: date_str = match.group(1) # 后续判断逻辑同上
方法二:预生成符合条件的日期模式,用glob批量匹配(更高效)
如果你的日期范围固定(2022-2023年1-6月前15天),可以先生成所有符合条件的日期字符串,再构造对应的glob模式,让glob直接过滤出目标文件,减少后续处理的工作量。
示例代码:
import glob from datetime import datetime, timedelta folder_path = "..." # 生成所有符合条件的日期字符串(yyyyMMdd格式) start_date = datetime(2022, 1, 1) end_date = datetime(2023, 6, 15) date_patterns = [] current_date = start_date while current_date <= end_date: # 跳过7-12月的日期,直接跳到下一年1月 if current_date.month >6: current_date = datetime(current_date.year +1, 1, 1) continue date_str = current_date.strftime("%Y%m%d") date_patterns.append(f"{folder_path}/*{date_str}A*.pq") current_date += timedelta(days=1) # 批量匹配所有模式的文件 filtered_files = [] for pattern in date_patterns: filtered_files.extend(glob.glob(pattern)) # 按需去重 filtered_files = list(set(filtered_files)) print(filtered_files)
两种方法对比
- 方法一:无需提前生成日期列表,适配文件名格式变动,代码可读性高,适合日期范围大或者文件名格式不固定的场景。
- 方法二:直接让glob做过滤,减少Python层面的循环判断,效率更高,适合日期范围明确且较小的场景。
内容的提问来源于stack exchange,提问作者whitepanda
相关产品推荐
相关产品推荐

