我正在编写一个简单的程序,它将从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和下一个空白行之间的所有内容。
有什么想法吗?
答案 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 这是我看到解析日志的最佳方法;)