Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 5, 2010 14:45:40

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

Уважаемые господа, нужна помощь!
Есть лог вида:
Event: Newstate
Privilege: call,all
Channel: SIP
ChannelState: 5
ChannelStateDesc: Ringing
CallerIDNum: 300
CallerIDName:
Uniqueid: 1262695134.16

Значение и длина сообщений различна. Формат всегда поле и его значение через двоеточие.
Задача по любому из полуй значение записывать в переменную. Не знаю как распарсить, например нахожу вхождение Event в тексте, а как извлеч значение что-то не понимаю. Помогите пожалуйста.
Спасибо.



Офлайн

#2 Янв. 5, 2010 15:05:58

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

Regular Expressions

Офлайн

#3 Янв. 5, 2010 15:08:29

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

Можно просто сделать сплит по строкам, а затем строку по двоеточию.



Отредактировано (Янв. 5, 2010 15:08:43)

Офлайн

#4 Янв. 5, 2010 15:14:37

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

Сейчас я ищу вхождение ключа в логе, но этот рог различной длины, нужно выбирать значение конкретного ключа



Офлайн

#5 Янв. 5, 2010 15:34:05

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

А в чем тогда проблема? Если тебе нужен словарь всех ключей и значений, то можно через сплит. Если нужно только одно значение, то через регексы будет быстрее:

print re.findall('%s: (.*?)\n' % key, i)
где i - лог, key - имя ключа.



Офлайн

#6 Янв. 5, 2010 15:34:09

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

сделал так:
for s in result.split('\r'):
line=s.strip()
print line.split(':')

результат такой:








получились кортежи? как теперь извлечь значение



Офлайн

#7 Янв. 5, 2010 15:36:48

expee
От:
Зарегистрирован: 2009-12-21
Сообщения: 197
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

pal201
сделал так:
for s in result.split('\r'):
line=s.strip()
print line.split(':')

результат такой:








получились кортежи? как теперь извлечь значение
Получились списки. А значения у тебя в них хранятся с индексом 1.



Отредактировано (Янв. 5, 2010 15:37:03)

Офлайн

#8 Янв. 5, 2010 15:50:41

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

Да да, так и попробовал. Только вот проблема есть списки, в которых нет элементов:
for s in result.split('\r'):
line=s.strip()
n=line.split(':')
if ‘' in n:
n.remove(’')
print n












Соответственно надо удалять пустые



Офлайн

#9 Янв. 5, 2010 15:57:47

pal201
От:
Зарегистрирован: 2010-01-05
Сообщения: 83
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

Теперь сделал так:
for s in result.split('\r'):
line=s.strip()
n=line.split(':')
if '' in n:
del n
else:
print n

Вроде как все работает, только вот обратная сторона: теперь ужаляются не только рустые списки, но и там где есть 1 значение, а второго нет



Офлайн

#10 Янв. 5, 2010 17:16:19

Alex2ndr
От:
Зарегистрирован: 2009-12-26
Сообщения: 204
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг лога Нужна помощь

Что-то вы как-то странно все делаете.
Если пустые списки получаются из пустых строк, то при разборе файла можно просто не обрабатывать эти строки -

if not line: continue
где line - переменная, в которую вы получаете строку



Отредактировано (Янв. 5, 2010 17:18:48)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version