我仍然是python的新手,无法实现我想要的东西。我正在使用Python 3.7.0
我有一个名为log.csv的文件,其中包含CANbus消息的日志。
我想检查列标签 ID 中的 ID 为 348 时列标签 Data2 和 Data3 的内容是什么。
如果它们都与"00"不同,我想用"Data3+Data2"制作一个名为 fault_code 的新字符串。
然后我想检查出现此代码字符串的另一个 CSV 文件,并打印此行的第 6 列(标签描述(。但是最后一部分我只想每fault_code做一次。
这是我的代码:
import csv
CAN_ID = "348"
with open('0.csv') as log:
reader = csv.reader(log,delimiter=',')
for log_row in reader:
if log_row[1] == CAN_ID:
if (log_row[5]+log_row[4]) != "0000":
fault_code = log_row[5]+log_row[4]
with open('Fault_codes.csv') as fault:
readerFC = csv.reader(fault,delimiter=';')
for fault_row in readerFC:
if "0x"+fault_code in readerFC:
print("{fault_row[6]}")
这是日志.csv文件的一部分
Timestamp,ID,Data0,Data1,Data2,Data3,Data4,Data5,Data6,Data7,
396774,313,0F,00,28,0A,00,00,C2,FF
396774,314,00,00,06,02,10,00,D8,00
396775,**348**,2C,00,**00,00**,FF,7F,E6,02
这是错误代码的一部分.csv
Level;LED Flashes;UID;FID;Type;Display;Message;Description;RecommendedAction
1;2;1;**0x4481**;Warning;F12001;Handbrake Fault;Handbrake is active;Release handbrake
1;5;1;**0x4541**;Warning;F15001;Fan Fault;blablabla;blablalba
1;5;2;**0x4542**;Warning;F15002;blablabla
另外,您是否想到了完成此任务的更好方法?我读过熊猫可以很好地处理大文件。作为 log.csv可以有 100'000+ 行,使用它可能是个更好的主意。你觉得怎么样?
感谢您的帮助!
小心缩进,您会收到此错误,因为有时您使用空格和其他制表符进行缩进。
正如PM 2Ring所说,每次读取日志的1行时读取"Fault_codes.csv"确实效率不高。
您应该读取一次错误代码并将内容存储在 RAM 中(如果适合(。您可以使用熊猫来执行此操作,并将内容存储到数据帧中。我会在阅读您的日志之前这样做。
您无需将所有日志.csv行存储在RAM中。所以我会继续用csv模块逐行阅读它,做我的东西,写入一个新文件,然后阅读下一行。无需在此处使用熊猫,因为它会免费填满您的 RAM。