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

如何用Python读取过去7天的CSV文件?自定义函数解析

我来帮你把这个读取过去7天CSV文件的函数捋顺并完善好!先拆解下你现有代码的思路,再一步步补全优化:

解析现有代码逻辑

你的函数核心思路是基于文件名中的时间戳,匹配过去7天内的CSV文件:

  • 用par_datetime作为基准时间,先算出一周前的时间点作为起始
  • 循环遍历从起始时间到基准时间的每一个时间单位(你这里用了小时,因为格式是%Y_%m_%d-%H)
  • 对每个时间点,生成对应的文件名匹配规则,然后遍历目录找符合的文件

不过现有代码有几个未完成/可以优化的地方:

  • 文件名匹配的逻辑没写完(par_file_wildcard + sdate + ...),缺少后缀或通配符
  • 每次循环都调用os.listdir遍历整个目录,效率偏低
  • 没有收集匹配到的文件路径,也没做返回
  • 时间循环的步进逻辑不明确(你没写proc_datetime怎么递增)
完善后的完整函数

我给你补全并优化了代码,保留你的核心逻辑,同时解决上述问题:

import os
import glob
from datetime import datetime, timedelta
import logging

# 先初始化日志(如果你的项目里已经有日志配置,可以去掉这部分)
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

class YourDataProcessor:  # 假设这是你的类,因为函数用了self参数
    def i_get_last_week_file(self, par_path, par_file_wildcard, par_datetime):
        # 计算过去7天的起始时间:从基准时间往前推7天,覆盖完整的7天范围
        start_datetime = par_datetime - timedelta(days=7)
        logger.info('Processing time range: %s to %s', str(start_datetime), str(par_datetime))
        
        matched_files = []
        current_datetime = start_datetime
        
        # 按小时遍历时间范围(因为你的文件名精确到小时)
        while current_datetime <= par_datetime:
            # 生成文件名中的时间戳部分,和你的文件命名格式对应
            time_str = current_datetime.strftime('%Y_%m_%d-%H')
            # 构建完整的文件匹配模式:前缀+时间戳+CSV后缀通配符
            file_pattern = f"{par_file_wildcard}{time_str}*.csv"
            # 拼接目录路径和匹配模式,避免路径拼接错误
            full_pattern = os.path.join(par_path, file_pattern)
            
            # 用glob直接查找符合模式的文件,比os.listdir+手动判断高效
            for file_path in glob.glob(full_pattern):
                # 确保找到的是文件(不是子目录)
                if os.path.isfile(file_path):
                    matched_files.append(file_path)
                    logger.info(f"Found target file: {file_path}")
            
            # 时间步进1小时,匹配下一个小时的文件
            current_datetime += timedelta(hours=1)
        
        # 返回所有匹配到的过去7天的CSV文件路径
        return matched_files
关键优化点说明
  • 替换遍历方式:用glob.glob替代os.listdir+fnmatch,直接按规则查找文件,代码更简洁,效率更高
  • 明确时间范围:从par_datetime - 7天到par_datetime,确保覆盖完整的过去7天
  • 完整路径处理:用os.path.join拼接目录和文件名,避免跨平台路径问题
  • 文件校验:增加os.path.isfile判断,排除子目录干扰
  • 补全匹配规则:在时间戳后添加*.csv,确保只匹配CSV文件
  • 时间步进逻辑:明确每小时递进一次,和你文件名中的%H格式对应
额外优化建议
  • 如果你的文件名时间精度是天(比如%Y_%m_%d),可以把timedelta(hours=1)改成timedelta(days=1),同时修改strftime的格式
  • 需要递归查找子目录的话,把glob.glob改成glob.glob(full_pattern, recursive=True),并把模式改成**/{file_pattern}
  • 若文件数量极大,可以改成生成器返回(把matched_files.append改成yield file_path),节省内存
  • 可以新增参数time_precision(比如'hour'/'day'),让函数适配不同的文件名时间精度

内容的提问来源于stack exchange,提问作者jovicbg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:10:12