Python帮助-解析数据包日志

4
我正在编写一个简单的程序,将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个回答

2

查看file.readlines()文档:

file.readlines([sizehint])

使用readline()读取直到EOF,然后返回包含已读取行的列表。如果存在可选的sizehint参数,不会读取完整个文件,而是读取大约sizehint字节的整行(可能会四舍五入到内部缓冲区大小之后)。实现文件类似接口的对象可以选择忽略sizehint,如果无法实现或者无法高效实现则忽略。

file.readline()文档:

file.readline([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

这也是我的第一反应。同样的讲话稍微更新一些,可以在http://www.dabeaz.com/generators-uk/上找到。我实际上做过关于生成器管道的梦(多么奇怪啊)。 - Peter Rowell

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

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:

这个程序有一个很好的特性,它可以找到文件末尾没有空行结束的块。

此外,这个程序非常容易推广,因为它没有显式的状态变量,你只需要进入另一个循环来处理其他类型的块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接