csv 用Python解析两个文件[重复]

7bsow1i6  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(93)

此问题已在此处有答案

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+行,使用它可能是一个更好的主意。你觉得怎么样?
谢谢您的帮助!

khbbv19g

khbbv19g1#

小心你的缩进,你得到这个错误,因为你有时你使用空格和其他制表符来缩进。
正如PM 2Ring所说,每次读取1行日志时阅读'Fault_codes.csv'确实效率不高。
您应该读取一次faultcode并将内容存储在RAM中(如果合适的话)。您可以使用pandas来完成此操作,并将内容存储到DataFrame中。在阅读你的日志之前我会先这么做的。
您不需要将所有log.csv行存储在RAM中。所以我会用csv模块一行一行地阅读它,做我的事情,写一个新文件,然后读下一行。这里不需要使用pandas,因为它会白白填满你的RAM。

相关问题