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

Python for循环内将字符串转为日期类型实现日期比较

问题原因

CSV读取返回的所有字段默认是str字符串类型,无法直接和date/datetime类型的todays_Date做大小比较,必须先将字符串按照对应日期格式解析为日期类型对象,才能完成比较。
另外你原有代码存在三个额外问题:

  • 读取CSV的代码行、循环行存在多余缩进,会触发Python缩进错误
  • 判断逻辑写反:有效期大于当日代表卡片未过期,你当前写的是该场景下输出nop(过期),和最初的需求不符
  • 直接用open()打开文件没有手动关闭,会造成资源泄漏
解决步骤
  1. 导入datetime模块的日期解析方法
  2. 先确认CSV中存储的有效期字符串的实际格式(常见如2024-12-31、12/31/2024、31-12-2024等)
  3. 用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 18:54:32