Python help - Парсинг журналов пакетов - PullRequest
3 голосов
/ 16 ноября 2008

Я пишу простую программу, которая собирается проанализировать лог-файл дампа пакетов из wireshark в более читаемую форму. Я делаю это с питоном.

В настоящее время я застрял на этой части:

for i in range(len(linelist)):
if '### SERVER' in linelist[i]:
    #do server parsing stuff

    packet = linelist[i:find("\n\n", i, len(linelist))]

linelist - это список, созданный с использованием метода readlines (), поэтому каждая строка в файле является элементом списка. Я перебираю его для всех вхождений "### SERVER", а затем перебираю все строки после него до следующей пустой строки (которая обозначает конец пакета). Я, должно быть, что-то делаю не так, потому что не только find () не работает, но у меня есть ощущение, что есть лучший способ перехватить все между ### SERVER и следующим появлением пустой строки.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 16 ноября 2008

Просмотр файла file.readlines () doc:

file.readlines ([sizehint])

Чтение до EOF с использованием readline () и возврат списка, содержащего прочитанные строки. Если присутствует необязательный аргумент sizehint, вместо чтения до EOF читаются целые строки, составляющие приблизительно байты sizehint (возможно, после округления до внутреннего размера буфера). Объекты, реализующие файловый интерфейс, могут игнорировать sizehint, если он не может быть реализован или не может быть реализован эффективно.

и file.readline () doc:

file.readline ([размер])

Прочитать одну целую строку из файла. Конечный символ новой строки сохраняется в строке (но может отсутствовать, когда файл заканчивается неполной строкой). [6] Если аргумент size присутствует и неотрицателен, это максимальный счетчик байтов (включая завершающий перевод строки), и может быть возвращена неполная строка. Пустая строка возвращается, только когда EOF встречается немедленно.

A trailing newline character is kept in the string - означает, что каждая строка в linelist будет содержать не более одной новой строки. Вот почему вы не можете найти подстроку "\n\n" ни в одной из строк - ищите целую пустую строку (или пустую в EOF):

if myline in ("\n", ""):
    handle_empty_line()

Примечание. Я пытался объяснить поведение find, но решение Pythonic сильно отличается от вашего фрагмента кода.

0 голосов
/ 16 ноября 2008

лучший способ - использовать генераторы читать презентацию Трюки с генераторами для системных программистов Это лучшее, что я видел по поводу разбора лога;)

0 голосов
/ 16 ноября 2008

Это также хорошо работает с явным итератором. Таким образом, вложенные циклы могут обновлять состояние итератора, потребляя строки.

fileIter= iter(theFile)
for x in fileIter:
    if "### SERVER" in x:
        block = [x]
        for y in fileIter:
            if len(y.strip()) == 0: # empty line
                break
            block.append(y)
        print block # Or whatever
    # elif some other pattern:

Это имеет приятное свойство находить блоки, которые находятся в конце файла, и не имеют пустой строки, завершающей их.

Кроме того, это довольно просто обобщить, поскольку нет явных переменных изменения состояния, вы просто переходите в другой цикл, чтобы впитывать строки в других типах блоков.

0 голосов
/ 16 ноября 2008

Общая идея:

inpacket = False
packets = []
for line in open("logfile"):
  if inpacket:
    content += line
    if line in ("\n", ""): # empty line
      inpacket = False
      packets.append(content)
  elif '### SERVER' in line:
    inpacket = True
    content = line
# put here packets.append on eof if needed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...