0

我有一个日志文件,在文件中每一行的末尾都有这个字符串: 行号Line:#在哪里。#

我正在尝试获取 # 并将其与上一行的编号进行比较。在 python 中做到这一点的最佳方法是什么?

4

2 回答 2

4

我可能会使用str.split,因为它看起来很容易:

with open('logfile.log') as fin:
    numbers = [ int(line.split(':')[-1]) for line in fin ]

现在您可以使用zip将一个数字与下一个数字进行比较:

for num1,num2 in zip(numbers,numbers[1:]):
    compare(num1,num2)  #do comparison here.

当然,这并不懒惰(当你真的一次只需要 2 个时,你一次将每个行号存储在文件中),所以如果你的文件很大,它可能会占用大量内存。不过,让它变得懒惰并不难:

def elem_with_next(iterable):
    ii = iter(iterable)
    prev = next(ii)
    for here in ii:
        yield prev,here
        prev = here

with open('logfile.log') as fin:
    numbers = ( int(line.split(':')[-1]) for line in fin )
    for num1,num2 in elem_with_next(numbers):
        compare(num1,num2)
于 2013-01-16T16:52:04.117 回答
3

我假设您没有方便的东西来拆分字符串,这意味着正则表达式可能更有意义。也就是说,如果日志文件中的行结构如下:

date: 1-15-2013, error: mildly_annoying, line: 121
date: 1-16-2013, error: err_something_bad, line: 123

然后您将无法line.split('#')按照建议使用 mgilson,尽管如果始终有冒号,line.split(':')可能会起作用。在任何情况下,正则表达式解决方案看起来像:

import re
numbers = []
for line in log:
    digit_match = re.search("(\d+)$", line)
    if digit_match is not None:
        numbers.append(int(digit_match.group(1)))

这里的表达式"(\d+)$"匹配一些数字,然后是行尾。我们使用返回的匹配对象上的方法提取数字,group(1)然后将它们添加到我们的行号列表中。

如果您不确定“Line: #”是否总是出现在日志的末尾,您可以将上面使用的正则表达式替换为类似于"Line:\s*(\d+)"检查字符串“Line:”的内容,然后是一些(或否)空格,然后是任意位数。

于 2013-01-16T16:58:43.190 回答