从当前的日志文件中,我只能选择最高的响应时间(R.T),但是我需要从中获取前20个最高值。
我拥有的日志文件中有数百万行具有不同的R.T(响应时间)的行。
日志文件格式
例:
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
代码1:
with open(r"file.txt","r") as f:
data = f.readlines()
# sort the data by response time descending using lambda as key
sorted_data = sorted(data,
key=lambda row: row.split()[10],
reverse=True)
输出:(R.T高的日志文件)
00.00.00.000 - - [dd/mm/yyyy:hr:mm:se +0800] GET Url HTTP/1.1 200 dataconsumed (R.T) mainURL xxx/0.0 (x xxx 0.0; xx00) xx/00.00 (xx, xx xxx) /00.0.0000. xx/000.00
代码2
file = open(r"file.txt","r")
rts = []
for line in file:
line_array = line.split(" ")
rts.append(float(line_array[10]))
max_rt = max(rts)
print "Max R.T is :", max_rt
file.close()
输出:最高R.T
最大R.T是:R.T
帮我!!!
从日志文件中找到20个最大值。
最佳答案
为此,您可能要使用堆。 Python恰好有一个带有heapq
函数的nlargest
模块。这将使您不必存储每一行,而这是sort and slice方法所必需的。
from heapq import nlargest
with open('naveen.log') as f:
top20 = nlargest(20, f, key=lambda L: float(L.split()[10]))
for t in top20:
print(t)
您也可以使用
deque
,它的最大长度可以固定。例如collections.deque(maxlen=20)
请参阅我在上面的评论,以获取有关如何格式化数据的说明。当前,如果您将一行分割(在空格上),它将时间戳减半,并且您想要的参数位于第11个索引处。如果所有时间戳都具有
+0800
,则可以使用第11个索引,并且您很贴心,但是如果没有,那么您可能需要采用更复杂的方法来拆分字符串(正则表达式)。关于python - 从原始日志文件中排序前20个最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42152091/