Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 5, 2010 18:38:13

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

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

pal201
for s in result.split('\r'):
Зря по \r разрезаешь, это только на винде перенос строки делается \n\r, на нормальных осях уже избавились от пережитка печатных машинок вроде переноса каретки :) Сплитуй по \n. Итого:
for line in result.split('\n'):
if line:
name, val = line.split(':')
print name, val



Офлайн

#2 Янв. 5, 2010 18:41:44

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

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

pasaranax, у него может и не быть значения, а только ключ (как в примере - CallerIDName). Так что лучше, например, через try/except.



Офлайн

#3 Янв. 5, 2010 19:39:42

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

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

expee
pasaranax, у него может и не быть значения, а только ключ (как в примере - CallerIDName). Так что лучше, например, через try/except.
Тогда val будет равно '', то есть пустой строке. А вот если в строке лога появится второе двоеточие, то вылезет исключение.



Офлайн

#4 Янв. 5, 2010 20:03:50

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

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

pasaranax
Тогда val будет равно '', то есть пустой строке. А вот если в строке лога появится второе двоеточие, то вылезет исключение.
А ну да, просто не обратил внимания, что разбиваешь по ‘:’, а не по ‘: ’. В твоем случае придется еще резать пробелы в начале строки.



Офлайн

#5 Янв. 5, 2010 20:44:04

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

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

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

for s in result.split('\r'):
что это за result? если это все содержимое файла, то почему не
for s in open('logfile.log'):
и памяти жрет меньше и не нужно думать о символе окончания строки.
2. Если это какой-то кусок файла, то каково остальное содержимое? оно повторяет эти же группы, но с другими параметрами? или там список иных параметров - уникальных?
3. Неясна конечная задача всего этого - в каком виде надо подавать значения? может надо брать только определённые значения? и тд



Офлайн

#6 Янв. 5, 2010 21:08:40

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

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

Гы-гы… Asterisk однако… 1.4, кажется… AMI. Через телнет общаешься? :-) Я буквально две недели назад разбирал это.
Есть такая штука: pyst. Очень удобно и просто.
Ещё есть варианты на Twisted, но у меня не было времени в него въезжать.

Ты лучше опиши, что тебе конкретно надо и если могу – помогу.

P.S.

pal201
result.split('\r')
Астер разделяет это дело через ‘\r\n’.



Офлайн

#7 Янв. 5, 2010 21:22:19

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

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

Я писал автодозвонщик и склепал вот такую функцию для получения сообщений от Астера:

def recive(telnet, timeout=None):
'''Recive data from server.'''
logger.debug('Reciving data...')

if timeout is None:
raw = telnet.read_until('\r\n\r\n')[:-2]
else:
raw = telnet.read_until('\r\n\r\n', timeout)[:-2]

if not raw:
raise EOFError
logger.debug('Recived raw data: %r', raw)

data = {}
for line in raw.strip().split('\r\n'):
key, value = [s.strip() for s in line.split(':', 1)]
data[key] = value
logger.debug('Recived data: %r', data)

return data
Я не стал заморачиваться с нормальной эвэнт-системой, потому что тут оно не требуется – просто одним потоком и посылаю команды (Login и Originate), и получаю респонзы и эвэнты. Оно очень даже удобно оказалось…



Отредактировано (Янв. 5, 2010 21:25:55)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version