Python遍历两个CSV文件并对比时间戳范围的实现问题
问题解决:CSV时间范围匹配逻辑修复
我帮你梳理下代码里的问题,然后给出修复后的版本,保证能得到你想要的输出~
你的需求回顾
你有两个CSV文件,需要遍历File1的每个时间范围,找出File2中落在该范围内的时间戳,具体内容和预期输出如下:
CSV File1内容
Range1,2018-05-17 01:50:17+0000,2018-05-17 02:00:17+0000 Range2,2018-05-17 01:50:17+0000,2018-05-17 04:00:17+0000 Range3,2018-05-17 01:50:17+0000,2018-05-17 08:00:17+0000
CSV File2内容
TimeStamp1,2018-05-17 01:59:17+0000 TimeStamp2,2018-05-17 03:59:17+0000 TimeStamp3,2018-05-17 07:59:17+0000
预期输出
TimeStamp1 falls within Range1 TimeStamp1, TimeStamp2 falls within Range2 TimeStamp1, TimeStamp2, TimeStamp3 falls within Range3
原代码的问题分析
你的代码主要有几个明显的问题:
- 索引错误:CSV读取的行是从0开始索引的,你用
range_row[2]、range_row[3]去取时间范围,但File1每行只有3个元素(名称、开始时间、结束时间),应该用range_row[1]和range_row[2];同理File2每行只有2个元素,时间戳值是timeStamp_row[1],不是timeStamp_row[2]。 - 迭代器耗尽问题:
timeStamp_reader是一次性迭代器,第一次遍历完后就没有内容了,后续处理File1的下一行时,内层循环不会再执行。 - 语法错误:
if语句末尾缺少冒号:,这会直接导致代码运行报错。 - 文件打开模式:用
'rb'二进制模式打开文件,在Python中处理CSV应该用文本模式'r',还可以加上newline=''符合CSV模块的最佳实践。
修复后的代码
import csv # 先把File2的所有时间戳数据加载到列表中,避免迭代器耗尽 with open('File2', 'r', newline='') as timeStamp_file: timeStamp_reader = csv.reader(timeStamp_file) timestamp_list = list(timeStamp_reader) # 遍历File1的每个时间范围 with open('File1', 'r', newline='') as range_file: range_reader = csv.reader(range_file) for range_row in range_reader: range_name = range_row[0] start_time = range_row[1] end_time = range_row[2] # 收集当前范围内的所有时间戳名称 matched_timestamps = [] for ts_row in timestamp_list: ts_name = ts_row[0] ts_time = ts_row[1] # 直接比较时间字符串(这里格式统一可以直接比,复杂场景建议转datetime对象) if start_time <= ts_time <= end_time: matched_timestamps.append(ts_name) # 按照预期格式输出结果 if matched_timestamps: print(f"{', '.join(matched_timestamps)} falls within {range_name}")
关键修复点说明
- 预加载File2数据:把File2的内容转成列表保存,这样每次处理File1的一行时,都能重新遍历所有时间戳,解决了迭代器只能用一次的问题。
- 修正索引值:正确使用0-based索引获取每行的元素,避免索引越界错误。
- 语法修正:补上
if语句的冒号,调整文件打开模式为文本模式,确保代码能正常运行。 - 统一输出格式:先收集所有匹配的时间戳,再用逗号分隔后打印,完全符合你想要的输出样式。
内容的提问来源于stack exchange,提问作者user3567212
相关产品推荐
相关产品推荐

