python - 用 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+ 行,使用它可能是一个更好的主意。你怎么看?
谢谢您的帮助!
解决方案
缩进时要小心,你会得到这个错误,因为你有时会使用空格和其他制表符来缩进。
正如 PM 2Ring 所说,每次阅读 1 行日志时阅读“Fault_codes.csv”确实效率不高。
您应该读取一次故障代码并将内容存储在 RAM 中(如果合适的话)。您可以使用 pandas 来执行此操作,并将内容存储到 DataFrame 中。在阅读您的日志之前,我会这样做。
您不需要将所有 log.csv 行存储在 RAM 中。所以我会继续用 csv 模块逐行阅读它,做我的事情,写入一个新文件,然后阅读下一行。无需在这里使用 pandas,因为它会填满你的 RAM。
推荐阅读
- c# - 无法加载 System.Threading.Tasks.Extensions
- security - 无需外部停机即可更改 redis 密码
- dhall - 如何使用 dhall 验证配置的内部一致性?
- android - 您如何使用带数字的点指示器创建视图寻呼机?
- gcc - 令人困惑的内联汇编
- c# - 如何通过 COM 将 SAFEARRAY 从 C++ 传递到 C#
- jsf - JSF 2.x 将复杂视图简化为单个标记
- reactjs - 使子组件重新渲染而不发送无用的道具
- java - Java HttpSessionListener:如何自定义不同类型的会话?
- python - Python - 网页抓取 - 分页卡在第 1 页,没有进一步进展