如何用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
相关产品推荐
相关产品推荐

