Python for循环仅匹配首个元素求助:多日期文件筛选失效
问题排查与修复建议
核心问题1:日期变量赋值错误
你在定义two_days_ago和three_days_ago的月、日、年份时,错误复用了yesterday.strftime(),导致这三个日期的前缀完全一致:
# 错误示例: two_days_ago_month = yesterday.strftime('%m') # 应为 two_days_ago.strftime('%m') two_days_ago_day = yesterday.strftime('%d') # 应为 two_days_ago.strftime('%d') two_days_ago_year = yesterday.strftime('%Y') # 应为 two_days_ago.strftime('%Y') three_days_ago_month = yesterday.strftime('%m') # 同理,需改用three_days_ago的日期对象
这使得你的OR条件实际是三次判断同一个日期前缀,自然只能匹配到昨天的文件。
核心问题2:年份判断范围过窄
第二个if仅判断文件是否以three_days_ago_year.txt结尾,意味着即使文件名前缀符合昨天或两天前的日期,只要年份不是三天前的就会被过滤,不符合需求。
修复后的代码
from datetime import date, timedelta import pandas as pd import os today = date.today() yesterday = today - timedelta(days=1) yesterday_date = yesterday.strftime('%m%d%Y') two_days_ago = today - timedelta(days=2) two_days_ago_date = two_days_ago.strftime('%m%d%Y') three_days_ago = today - timedelta(days=3) three_days_ago_date = three_days_ago.strftime('%m%d%Y') if event == '-WEEKEND UPDATE-': filemap = r'C:\Users\__\Desktop\Data Files\Reporting' final_sheet = pd.DataFrame() os.chdir(filemap) # 整理所有需要匹配的文件名前缀(月日部分) target_prefixes = [ f'DetailReport_{yesterday_date[:4]}', f'DetailReport_{two_days_ago_date[:4]}', f'DetailReport_{three_days_ago_date[:4]}' ] # 对应前缀的年份 target_years = [ yesterday_date[4:], two_days_ago_date[4:], three_days_ago_date[4:] ] for file in os.listdir(filemap): # 遍历前缀和年份,匹配对应文件 for prefix, year in zip(target_prefixes, target_years): if file.startswith(prefix) and file.endswith(f'{year}.txt'): df1 = pd.read_csv(file, sep='|', encoding='UTF-8', on_bad_lines='warn', quotechar='"', quoting=3) final_sheet = pd.concat([final_sheet, df1], ignore_index=True) break # 匹配到后跳出循环,避免重复处理 dropcolumns = ['Address', 'First Name', 'Last Name'] final_sheet = final_sheet.drop(columns=dropcolumns)
额外优化点
- 直接将日期格式化为
%m%d%Y,一次性获取月、日、年,减少冗余变量。 - 用列表存储目标前缀和对应年份,通过循环替代多个OR条件,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

