Я должен написать парсер для файла данных, который мы используем на работе. Я выбрал Pandas, потому что я прочитал, что он довольно быстрый, и на нем большое внимание уделяется производительности. В качестве примечания, я никогда не использовал Pandas до сегодняшнего дня.
Насколько я понимаю, мне нужно сообщить Pandas, где моя строка заголовков находится в CSV-подобном файле. Но файлы в работе могут иметь переменное количество строк до начала фактических данных.
Пример:
Software :SomeCorpSoft 2.3.4
Measurement Name;default
Created;2017-11-30T11:42:09Z
Scan Type;Threshold scan
Serial Number;A-SERIAL-NUM-1234
Sensor Nickname;
Trend Count;1
Trigger Level;0
Trigger Holdoff;0
start;0
end ;0
F1; 44.12; H; 8;
Time;F1 ;V 1 ;Hp 1 ;C 1 ;P 1 ;V 2 ;Hp 2 ;C 2 ;P 2 ;V 3 ;Hp 3 ;C 3 ;P 3 ;V 4 ;Hp 4 ;C 4 ;P 4 ;V 5 ;Hp 5 ;C 5 ;P 5 ;V 6 ;Hp 6 ;C 6 ;P 6 ;V 7 ;Hp 7 ;C 7 ;P 7 ;V 8 ;Hp 8 ;C 8 ;P 8 ;
0;13.448671;349.458099365;0;7.72320135575;-105.609801195;8.54580983665;-15.5168133183;0.0477259658688;101.686749515;4.46981738574;152.711715748;0.0728701513916;77.1428145399;17.8438225472;-163.940792731;0.95931622744;48.4915601658;0.525170185762;-85.3977558257;0.255517896038;-58.4781138655;2.0410204213;131.266863348;0.291022526301;-145.942080277;12.7706899744;-150.335793306;1.3724642398;-161.919972567;5.3790623792;-148.609825665;0.512542366745;-177.811876518;
Так что в этом примере мои фактические заголовки находятся в строке 14 (13, если это игнорирует пустые строки, не уверен насчет этого), где он начинается с Время (это константа, так что, может быть, какой-то лямбда-способ принять это во внимание?)
Но мне также нужно предыдущие строки, чтобы сформировать различные объекты в базе данных (например, " Created; " дает мне время измерения).
Затем мне нужно создать экземпляры объектов для каждого из заголовки. Они соответствуют приведенным ниже данным, например:
Time -> 0
F1 -> 13.448671
V1 -> 349.458099365
... so on...
Итак, у меня есть
import pandas as pd
df = pd.read_csv(file_dir)
for i in df.values:
for x in i:
if "Software" in x:
software_ver = x.split(':')[1]
if "Time" in x:
headers = x
Но что такое "дешево"? Вероятно, есть Pandas способ сделать это. После этого я планировал сделать zip для каждой строки после заголовков, так как они все совпадают, чтобы я мог связать значения с заголовком, но, опять же, возможно, лучший способ сделать это, более эффективный.
Файлы могут иметь пару сотен тысяч строк, и мне нужно создать один экземпляр объекта для каждого элемента заголовка каждой строки. У текущего парсера у нас есть несколько минут, но мне нужно сократить это время.