【问题标题】:Parsing two files with Python用 Python 解析两个文件
【发布时间】: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/…
  • 好的,我只使用制表符解决了缩进问题,并在我的编辑器上设置了正确的制表长度。感谢您指出这一点。

标签: python csv compare


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的!我将检查 pandas 如何与 DataFrame 一起工作,然后与循环中的其他文件进行比较。
猜你喜欢
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2021-11-15
  • 2022-01-19
相关资源
最近更新 更多