Этот формат почти разбирается как csv
, но не совсем, потому что четвертое поле - JSON, и вы не сможете гарантировать, что JSON не содержит строк со встроенными точка с запятой. Итак, я думаю, что вы, вероятно, хотите просто использовать функции манипуляции со строками (или, скорее, байтами):
def parsemsg(buf):
s, cmd, length, rest = buf.split(b';', 3)
j, _, e = rest.rpartition(b';')
if s != b'S' or e != b'E':
raise ValueError('must start with S and end with E')
return cmd.decode('utf-8'), int(length), json.loads(j)
Тогда:
>>> parsemsg(b'S,SEND,40,{"ID":"asg01","T":1,"P":{"T":180}},E')
('SEND', 40, {'ID': 'asg01', 'T': 1, 'P': {'T': 180}})
Фактическая часть анализа точки с запятой занимает 602 нс на моем ноутбуке, decode
и int
повышают это до 902 нс. json.loads
, с другой стороны, занимает 10US. Так что, если вы беспокоитесь о производительности, JSON-часть действительно является единственной частью, которая имеет значение (пробуя сторонние библиотеки JSON, которые я установил, самая быстрая из них - все еще 8.1us, что не намного лучше). Вы могли бы также сделать все остальное простым и надежным.
Кроме того, учитывая, что вы читаете это со скоростью 115000 бод, вы не можете получить эти сообщения быстрее, чем примерно 6 мс, поэтому потратить 11US на их разбор даже не близко к проблеме.