Python for循环内将字符串转为日期类型实现日期比较
问题原因
CSV读取返回的所有字段默认是str字符串类型,无法直接和date/datetime类型的todays_Date做大小比较,必须先将字符串按照对应日期格式解析为日期类型对象,才能完成比较。
另外你原有代码存在三个额外问题:
- 读取CSV的代码行、循环行存在多余缩进,会触发Python缩进错误
- 判断逻辑写反:有效期大于当日代表卡片未过期,你当前写的是该场景下输出nop(过期),和最初的需求不符
- 直接用
open()打开文件没有手动关闭,会造成资源泄漏
解决步骤
- 导入
datetime模块的日期解析方法 - 先确认CSV中存储的有效期字符串的实际格式(常见如
2024-12-31、12/31/2024、31-12-2024等) - 用
datetime.strptime()方法按照匹配的格式把字符串解析为和todays_Date同类型的日期对象,再做比较
修正后完整代码
import csv from datetime import datetime number = input('Enter the card number\n').strip() # 用上下文管理器打开CSV,自动处理文件关闭 with open('carddetails.csv', "r", encoding="utf-8") as f: csv_file = csv.reader(f, delimiter=",") for row in csv_file: if number == row[1].strip(): # !!!注意把"%Y-%m-%d"替换成你CSV里实际的日期格式 # 如果todays_Date是带时分秒的datetime类型,去掉末尾的.date()即可 valid_to_date = datetime.strptime(row[3].strip(), "%Y-%m-%d").date() # 当日日期大于有效期 = 卡片过期 if todays_Date > valid_to_date: print("nop") else: print("yep") break
日期格式符参考
%Y:4位完整年份,例2024%y:2位年份,例24代表2024%m:2位月份,补前导零,例01代表1月%d:2位日期,补前导零,例09代表9号- 例:如果CSV中存的日期是
12/31/2024(月/日/年),解析格式就写"%m/%d/%Y";如果是31/12/2024(日/月/年),解析格式就写"%d/%m/%Y",格式必须和存储值完全一致,否则会抛出解析错误。
内容的提问来源于stack exchange,提问作者Daniel Reverent
相关产品推荐
相关产品推荐

