Python读取CSV精确匹配日期执行函数时子串误匹配如何解决
问题说明
现有Python脚本用于读取CSV文件,匹配规则为:当CSV行的Date字段包含当日服务器日期时,读取该行Name字段值。
使用的测试CSV内容如下:
Date,Name "16,30,7",Sparrow "1,30",Eagle "6,13",Penguin
初始实现代码:
user_inp="C:/MasterData/Userinputcsv" with open(user_inp,'r') as f: user_inp=DictReader(f) for row in user_inp: if str(date.today().day) in row['Date']: print(row['Name'])
当日日期为6号时,预期输出为Penguin,实际输出为Sparrow,Penguin,出现误匹配。
错误原因
直接使用in运算符做字符串子串判断时,不会识别逗号分隔的独立值边界:字符串"6"作为子串存在于"16"中,因此存了"16,30,7"的行被误判为匹配。该逻辑无法区分独立日期值和包含相同数字的其他日期(如6和16、26),不符合精确匹配独立值的需求。
解决方案
最稳妥的实现方式是先将Date字段按逗号拆分为独立日期值的集合,再判断当日日期是否存在于集合中,完全规避子串匹配的边界问题。
修正后的可运行代码如下:
import csv from datetime import date csv_path = "C:/MasterData/Userinputcsv" current_day = str(date.today().day) with open(csv_path, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: # 按逗号拆分日期值,去除每个值前后的空白字符后转为集合 date_set = {day.strip() for day in row['Date'].split(',')} if current_day in date_set: print(row['Name'])
逻辑说明
- 拆分后"16,30,7"会被处理为集合
{'16', '30', '7'},集合中不存在"6",不会触发误匹配 - 拆分后"6,13"会被处理为集合
{'6', '13'},当日为6号时可精准命中 - 新增的
strip()处理可兼容CSV中逗号后带空格的写法(如"6, 13"),鲁棒性更强 - 该实现无需编写复杂的正则匹配规则,代码可读性和维护成本远高于字符串边界匹配方案
内容的提问来源于stack exchange,提问作者Stay cool
相关产品推荐
相关产品推荐

