【发布时间】:2018-09-18 12:43:17
【问题描述】:
我还是 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]}")
这是 log.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
这是 faultcode.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
您还想出更好的方法来完成这项任务吗?我读过 Pandas 非常适合处理大文件。由于 log.csv 可以有 100'000+ 行,使用它可能是一个更好的主意。你怎么看?
感谢您的帮助!
【问题讨论】:
-
您可以随意嵌套
with块。但是,在 Python 3 中,您不能在缩进中混合制表符和空格。 -
顺便说一句,在循环中反复打开同一个文件(如“Fault_codes.csv”)效率不高。最好在循环外打开,或者将整个内容读入内存,或者如果确实需要多次读取,可以使用
.seek方法“倒带”它。 -
简单谷歌搜索给了我这个。不一致在于空格和制表符的使用。stackoverflow.com/questions/5685406/…
-
好的,我只使用制表符解决了缩进问题,并在我的编辑器上设置了正确的制表长度。感谢您指出这一点。