此问题已在此处有答案:
I'm getting an IndentationError (or a TabError). How do I fix it?(6个回答)
2天前关闭。
我对Python还是个新手,无法实现我想要的东西。我用的是Python 3.7.0
我有一个名为log.csv的文件,其中包含CANbus消息的日志。
我想检查列标签ID中的ID为348时列标签Data 2和Data 3的内容。
如果它们都不同于“00”,我想用“Data 3 + Data 2”创建一个名为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
首先,我得到一个TabError whith第二个“with as”。
P:\07 CAN\04 CanLoger\03 Script>python script.py
File "script.py", line 12
readerFC = csv.reader(fault,delimiter=';')
^
TabError: inconsistent use of tabs and spaces in indentation
如果在”with as“中有一个“with as”,还有另一种语法吗?
你有更好的方法来完成这项任务吗?我读到过Pandas可以很好地处理大文件。由于log.csv可以有100'000+行,使用它可能是一个更好的主意。你觉得怎么样?
谢谢您的帮助!
1条答案
按热度按时间khbbv19g1#
小心你的缩进,你得到这个错误,因为你有时你使用空格和其他制表符来缩进。
正如PM 2Ring所说,每次读取1行日志时阅读'Fault_codes.csv'确实效率不高。
您应该读取一次faultcode并将内容存储在RAM中(如果合适的话)。您可以使用pandas来完成此操作,并将内容存储到DataFrame中。在阅读你的日志之前我会先这么做的。
您不需要将所有log.csv行存储在RAM中。所以我会用csv模块一行一行地阅读它,做我的事情,写一个新文件,然后读下一行。这里不需要使用pandas,因为它会白白填满你的RAM。