Python处理CSV新增列时出现SyntaxError报错求助
解决CSV新增列的语法错误及实现思路
首先,咱们先搞定你遇到的语法错误:你写的csvfile.seek(testdata.Time<=t)完全用错了seek()方法的作用——这个方法是用来移动文件读取指针到指定字节位置的,根本不能传入条件判断表达式,这就是报错的直接原因,得把这部分逻辑彻底换掉。
接下来,咱们重新梳理实现需求的正确思路:要给每条记录新增light_during_5hours_ago列,判断当前记录时间的5小时范围内是否有light值为1的记录,核心是要正确解析时间、遍历比对时间范围。下面是可运行的完整代码示例:
import csv from datetime import datetime, timedelta # 定义时间格式,根据你的CSV实际时间格式调整,比如'%Y-%m-%d %H:%M:%S' TIME_FORMAT = '%Y-%m-%d %H:%M:%S' # 读取原始CSV数据 all_rows = [] with open('G:/testdata.csv', 'r', newline='', encoding='utf-8') as csvfile: reader = csv.DictReader(csvfile) # 新增表头 fieldnames = reader.fieldnames + ['light_during_5hours_ago'] for row in reader: # 解析当前行的时间为datetime对象 current_time = datetime.strptime(row['Time'], TIME_FORMAT) # 计算5小时前的时间点 five_hours_ago = current_time - timedelta(hours=5) # 标记是否存在符合条件的记录 has_light = 0 # 遍历所有已读取的行(如果记录按时间顺序排列,前面的行时间更早) for past_row in all_rows: past_time = datetime.strptime(past_row['Time'], TIME_FORMAT) if five_hours_ago <= past_time <= current_time: if past_row['light'] == '1': has_light = 1 break # 找到一个符合条件的就停止遍历 # 给当前行添加新列值 row['light_during_5hours_ago'] = str(has_light) all_rows.append(row) # 将处理后的数据写入新CSV with open('G:/testdata1.csv', 'w', newline='', encoding='utf-8') as csvoutput: writer = csv.DictWriter(csvoutput, fieldnames=fieldnames) writer.writeheader() writer.writerows(all_rows)
关键细节说明:
- 用
csv.DictReader和csv.DictWriter可以通过列名直接操作数据,避免索引错位的问题 - 时间解析格式必须和你CSV里的时间字符串完全匹配,比如你的时间是
MM/DD/YYYY HH:MM,就要把TIME_FORMAT改成'%m/%d/%Y %H:%M' - 如果你的CSV记录是按时间顺序排列的,还可以优化遍历逻辑(不用每次全量比对历史行);如果是乱序的,就需要保留全量比对的逻辑
- 你原来代码里
row.append('light_during_5hours_ago')的位置不对,应该在处理表头时添加新列名,而不是在循环行的时候操作
内容的提问来源于stack exchange,提问作者Rana Al Ameedee
相关产品推荐
相关产品推荐

