You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:55:20