基于节假日日期筛选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
相关产品推荐
相关产品推荐

