Разбор двух файлов с помощью Python - PullRequest
0 голосов
/ 18 сентября 2018

Я все еще новичок в Python и не могу сделать то, что я ищу.Я использую Python 3.7.0

У меня есть один файл с именем log.csv, содержащий журнал сообщений CANbus.

Я хочу проверить, что является содержимым метки столбца Data2 иData3, если в идентификаторе метки столбца указан 348.

Если они оба отличаются от «00», я хочу создать новую строку с именем fault_code с «Data3 + Data2».

Затем я хочу проверить другой CSV-файл, в котором появляется эта строка кода, и распечатать столбец 6 этой строки (описание метки).Но в этой последней части я хочу сделать это только один раз для кода ошибки.

Вот мой код:

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

Также вы думаете о лучшем способе решения этой задачи?Я читал, что Панды могут быть очень хороши для больших файлов.Поскольку log.csv может иметь 100'000 + ряд, возможно, лучше использовать его.Как вы думаете?

Спасибо за помощь!

1 Ответ

0 голосов
/ 18 сентября 2018

Будьте осторожны с отступами, вы получаете эту ошибку, потому что иногда вы используете пробелы и другие табуляции для отступа.

Как сказал PM 2Ring, читая 'Fault_codes.csv' каждый раз, когда вы читаете 1 строку вашего журналадействительно неэффективно.

Вы должны прочитать код ошибки один раз и сохранить содержимое в ОЗУ (если оно подходит).Вы можете использовать панды, чтобы сделать это, и сохранить содержимое в DataFrame.Я хотел бы сделать это, прежде чем читать ваши журналы.

Вам не нужно хранить все строки log.csv в оперативной памяти.Поэтому я продолжал читать его построчно с модулем csv, делать свои вещи, записывать в новый файл и читать следующую строку.Не нужно использовать панд здесь, так как это наполняет вашу память даром.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...