我有一个日志文件,在文件的每一行末尾都有这个字符串:
Line:#
其中#
是行号。
我正在尝试获取#并将其与上一行的数字进行比较。在python中最好的方法是什么?
答案 0 :(得分: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个时,你会立即在文件中存储每个行号),所以如果你的文件是 HUGE,它可能占用大量的内存。不过要让它变得懒惰并不难:
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)
答案 1 :(得分: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” :“然后是一些(或没有)空格,然后是任意数量的数字。