首页 > 解决方案 > 用 Python 解析两个文件

问题描述

我还是 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+ 行,使用它可能是一个更好的主意。你怎么看?

谢谢您的帮助!

标签: pythoncsvcompare

解决方案


缩进时要小心,你会得到这个错误,因为你有时会使用空格和其他制表符来缩进。

正如 PM 2Ring 所说,每次阅读 1 行日志时阅读“Fault_codes.csv”确实效率不高。

您应该读取一次故障代码并将内容存储在 RAM 中(如果合适的话)。您可以使用 pandas 来执行此操作,并将内容存储到 DataFrame 中。在阅读您的日志之前,我会这样做。

您不需要将所有 log.csv 行存储在 RAM 中。所以我会继续用 csv 模块逐行阅读它,做我的事情,写入一个新文件,然后阅读下一行。无需在这里使用 pandas,因为它会填满你的 RAM。


推荐阅读