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

基于节假日日期筛选CSV数据并导出非匹配结果

我来帮你搞定这个CSV筛选的问题,你的代码里有几个容易踩的小坑,咱们一步步来修正:

问题排查

你的代码没法得到预期结果,主要有三个关键问题:

  • 用了csv.reader读取文件,它返回的是列表格式的行数据,不能像字典那样用row['Date']直接通过表头名访问列,得换成csv.DictReader才行。
  • 节假日文件的表头是Holidays,但你代码里写的是row['Date'],这会直接触发KeyError,根本取不到节假日数据。
  • 最后只打印了筛选结果,没把数据导出成新的CSV文件,等于白忙活啦。
修正后的完整代码
import csv

# 第一步:读取节假日文件,把所有日期存入集合(查询速度比列表快很多)
holiday_dates = set()
with open('file2.csv', 'r', encoding='utf-8') as holiday_file:
    holiday_reader = csv.DictReader(holiday_file)
    for row in holiday_reader:
        # 对应file2的表头"Holidays",提取日期
        holiday_dates.add(row['Holidays'])

# 第二步:读取大型数据文件,筛选非节假日行并导出
with open('file1.csv', 'r', encoding='utf-8') as data_file, \
     open('filtered_data.csv', 'w', newline='', encoding='utf-8') as output_file:
    
    data_reader = csv.DictReader(data_file)
    # 用原文件的表头来创建写入器,保证输出格式和原文件一致
    data_writer = csv.DictWriter(output_file, fieldnames=data_reader.fieldnames)
    
    # 先写入表头
    data_writer.writeheader()
    
    # 遍历每一行,筛选非节假日的行
    for row in data_reader:
        # 对应file1的日期列表头"D",检查是否不在节假日集合里
        if row['D'] not in holiday_dates:
            data_writer.writerow(row)

print("筛选完成!结果已保存到 filtered_data.csv")
代码细节说明
  • 用集合存节假日:集合的成员查询速度是O(1),比列表的O(n)快得多,数据量大的时候优势特别明显。
  • csv.DictReader/DictWriter:这两个工具类能让我们直接通过表头名称访问列,不用手动数索引,既直观又不容易出错。
  • with上下文管理器:自动帮你管理文件的打开和关闭,不用担心忘记关文件导致的问题,代码也更简洁。
  • 编码和换行符:加上encoding='utf-8'和newline=''可以避免不同系统下的编码和换行问题,兼容性更好。

用你提供的示例文件测试的话,2014-06-08对应的那一行会被准确移除,其他行都会保留在新生成的filtered_data.csv里,完全符合你的预期。

内容的提问来源于stack exchange,提问作者Josephine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 14:12:33