我有一个日志文件,在文件中每一行的末尾都有这个字符串:
行号Line:#
在哪里。#
我正在尝试获取 # 并将其与上一行的编号进行比较。在 python 中做到这一点的最佳方法是什么?
我可能会使用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)
我假设您没有方便的东西来拆分字符串,这意味着正则表达式可能更有意义。也就是说,如果日志文件中的行结构如下:
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:”的内容,然后是一些(或否)空格,然后是任意位数。