Как преобразовать файл журнала в список объектов - PullRequest
0 голосов
/ 04 августа 2020

Я работаю с типом данных Журнал (ROS). Несколько объектов сохраняются в файле журнала следующим образом:

header: 
  seq: 2
  stamp: 
    secs: 1596526199
    nsecs: 140017032
  frame_id: ''
level: 2
name: "/replicator_node"
msg: "Replicator node dumping to /tmp/replicator_dumps"
file: "replicator_node.py"
function: "__init__"
line: 218
topics: [/move_mongodb_entries/status, /move_mongodb_entries/goal, /move_mongodb_entries/result,
  /move_mongodb_entries/cancel, /rosout, /move_mongodb_entries/feedback]
header: 
  seq: 2
  stamp: 
    secs: 1596526198
    nsecs: 848793029
  frame_id: ''
level: 2
name: "/mongo_server"
msg: "2020-08-04T09:29:58.848+0200 [initandlisten] connection accepted from 127.0.0.1:58672\
  \ #1 (1 connection now open)"
file: "mongodb_server.py"
function: "_mongo_loop"
line: 139
topics: [/rosout]

Как видите, не все находится в той же строке, что и его имя. Я хочу проанализировать его, чтобы получить список объектов - чтобы я мог получить к нему доступ следующим образом:

object[1].msg даст мне:

"2020-08-04T09:29:58.848+0200 [initandlisten] connection accepted from 127.0.0.1:58672 #1 (1 connection now open)"

Кроме того, иногда file name выглядит как : \home\nfoo\foo.py, что приводит к появлению файла журнала как:

file: "\home
foo\foo.py"

1 Ответ

0 голосов
/ 05 августа 2020

Это интересное упражнение ... Предполагая, что структура действительно согласована для всех записей журнала, вы можете попробовать что-то вроде этого - довольно запутанно, но это работает для примера из вопроса:

ros = """[your log above]"""
def manage_lists_2(log_ind, list_1, list_2, mystr):    
    if log_ind == 0:
        list_1.append(mystr.split(':')[0].strip())
    list_2[-log_ind].append(mystr.split(':')[1].strip())
    
m_keys2 = []
m_key_vals2 = [[],[]]
header_keys2 = []
header_key_vals2 = [[],[]]
stamp_keys2 = []
stamp_key_vals2 = [[],[]]

for log in logs:
    for l in log.splitlines():
        if l[0]!=" ":
            items = [m_keys2, m_key_vals2]            
        elif l[0:3] != "   ":
            items = [header_keys2, header_key_vals2]            
        else:
            items = [stamp_keys2, stamp_key_vals2]            
        manage_lists_2(logs.index(log), items[0], items[1], l)
for val in m_key_vals2:
    for a, b, in zip(m_keys2,val):        
        print(a, ": ",b)
        if a == "header":            
            for header_key in header_keys2:
                print('\t',header_key,':',header_key_vals2[m_keys2.index(a)][header_keys2.index(header_key)])
                if header_key == "stamp":
                    for stamp_key in stamp_keys2:
                        print('\t\t',stamp_key,':',stamp_key_vals2[m_keys2.index(a)][stamp_keys2.index(stamp_key)])
    print('---')

Вывод:

header :  
     seq : 2
     stamp : 
         secs : 1596526199
         nsecs : 140017032
     frame_id : 'one id'
level :  2
name :  "/replicator_node"
msg :  "Replicator node dumping to /tmp/replicator_dumps"
file :  "replicator_node.py"
function :  "__init__"
line :  218
topics :  [/move_mongodb_entries/status, /move_mongodb_entries/goal, /move_mongodb_entries/result, /move_mongodb_entries/cancel, /rosout, /move_mongodb_entries/feedback]
---
header :  
     seq : 2
     stamp : 
         secs : 1596526199
         nsecs : 140017032
     frame_id : 'one id'
level :  3
name :  "/mongo_server"
msg :  "2020-08-04T09
file :  "mongodb_server.py"
function :  "_mongo_loop"
line :  139
topics :  [/rosout]

Пройдя через это, я бы порекомендовал - если вы собираетесь делать это на регулярной основе - вы нашли способ хранить данные в формате xml; это естественно для этого.

...