Python帮助 - 解析数据包日志

时间:2008-11-16 03:39:46

标签: python parsing

我正在编写一个简单的程序,它将从wireshark解析数据包转储的日志文件,形成一种更易读的形式。我是用python做的。

目前我仍然坚持这一部分:

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 个答案:

答案 0 :(得分:1)

查看file.readlines() doc:

  

file.readlines([sizehint])

     

使用readline()读取EOF并返回包含如此读取的行的列表。如果存在可选的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解决方案与您的代码段完全不同。

答案 1 :(得分:0)

一般的想法是:

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

答案 2 :(得分:0)

这也适用于显式迭代器。这样,嵌套循环可以通过使用行来更新迭代器的状态。

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:

这具有查找位于文件尾部的块的愉快属性,并且没有空行终止它们。

此外,这很容易概括,因为没有明确的状态变化变量,你只需进入另一个循环来吸收其他类型的行中的行。

答案 3 :(得分:0)

最佳方式 - 使用发电机 阅读演示文稿Generator Tricks for Systems Programmers 这是我看到解析日志的最佳方法;)