如何用Python比较两个CSV的日期列并输出差异至第三个CSV
基于日期格式对比两个CSV文件差异并输出结果
问题分析
你需要实现基于特定日期格式对比两个CSV文件的差异并输出到新文件,但提供的原代码存在多处错误,且未实现核心的日期对比逻辑:
- 以只读模式(
r)打开文件却执行write操作,直接触发IO错误 with上下文管理器会自动关闭文件,无需手动调用close()- 在
with块外执行readlines(),此时文件已关闭,无法读取内容 - 仅简单对比整行内容,完全未涉及日期格式匹配的差异判断
修正后的完整实现方案
以下是符合需求的可运行脚本,包含日期格式统一、基于ID+日期的精准对比:
import csv from datetime import datetime # 自定义日期格式,根据你的实际CSV日期格式调整,如"%Y/%m/%d" "%d-%b-%Y" TARGET_DATE_FORMAT = "%Y-%m-%d" ID_COLUMN = "ID" DATE_COLUMN = "Date" def parse_csv(file_path): """读取CSV,返回以(ID, 标准化日期)为键的字典,存储整行数据""" csv_data = {} with open(file_path, 'r', newline='', encoding='utf-8') as f: reader = csv.DictReader(f) for row_num, row in enumerate(reader, start=2): # row_num从2开始对应CSV实际行号(跳过表头) # 解析并标准化日期格式,确保对比一致性 try: date_raw = row[DATE_COLUMN] date_obj = datetime.strptime(date_raw, TARGET_DATE_FORMAT) std_date = date_obj.strftime(TARGET_DATE_FORMAT) except ValueError: print(f"跳过第{row_num}行:日期格式不符合要求 -> {date_raw}") continue # 用ID+标准化日期作为唯一标识键 unique_key = (row[ID_COLUMN], std_date) csv_data[unique_key] = row return csv_data # 读取两个源CSV的数据 source1_data = parse_csv("example.csv") source2_data = parse_csv("example2.csv") # 筛选出source2有但source1没有的条目 diff_entries = [row for key, row in source2_data.items() if key not in source1_data] # 写入差异文件 if diff_entries: with open("DIFF.csv", 'w', newline='', encoding='utf-8') as out_file: writer = csv.DictWriter(out_file, fieldnames=diff_entries[0].keys()) writer.writeheader() writer.writerows(diff_entries) print("差异文件DIFF.csv已生成") else: print("两个文件基于ID和日期格式无差异")
核心功能说明
- 日期标准化:通过
datetime模块将日期统一转换为指定格式,避免因格式差异(如2024/05/20和2024-05-20)导致的误判 - 精准对比逻辑:采用
(ID, 标准化日期)作为唯一标识,确保是同一ID下的日期条目对比,比整行对比更贴合业务需求 - CSV规范处理:使用官方
csv模块读写,自动处理含逗号、引号的特殊字段,避免手动拼接字符串引发的格式错误 - 错误容错:对格式无效的日期行进行提示并跳过,提升脚本健壮性
原代码错误修正点
- 移除只读模式下的
write操作,改用csv模块规范读取 - 删除
with块内的手动close()调用,依赖上下文管理器自动管理文件生命周期 - 将文件读取逻辑移至
with块内,确保文件处于打开状态时读取内容 - 新增日期格式解析与标准化逻辑,实现需求要求的基于日期格式的差异对比
内容的提问来源于stack exchange,提问作者ProgammerProgammingPrograms
相关产品推荐
相关产品推荐

