Python中的新手需要帮助!
我有一个结构文件:
[timestamp] [level] [source] message
包含以下行(例如):
[Wed Oct 11 14:34:52 2000] [error] [client 127.0.0.1] error message
[Wed Oct 11 18:56:52 2000] [warning] [client 127.0.0.1] error message
[Wed Oct 11 22:15:52 2000] [critical] [client 127.0.0.1] error message
我需要按[level]对这些行进行排序,并在STDOUT中显示结果。但是有两个条件:我们必须有机会选择用于排序的[level]名称,并且所有具有upper [level]的行也应该显示。
[level] values:
critical = 50
error = 40
warning = 30
info = 20
debug = 10
我决定用西装做这件事:
suits = {'critical': 50, 'error': 40, 'warning': 30}
l = ['critical','error','warning']
print sorted(l, key=suits.get)
但我认为这不是最佳方式。
我希望你能帮我解决这个问题......
答案 0 :(得分:4)
我将此分为两部分:
1)编写一个函数,给定文件的一行,返回级别编号。将此level_number称为第2部分。
2)在您选择的排序调用中使用该函数和key参数:
with open(fname) as f:
sorted_lines = sorted(f, key=level_number)
可以使用拆分或正则表达式创建1)的函数。
答案 1 :(得分:2)
快速单行,让您有一些想法从文本行获取密钥:
{'critical': 50, 'error': 40, 'warning': 30, 'info': 20, 'debug': 10}.get(line.split('] [')[1].lower(), 0)
请勿在生产代码中使用此功能,请记住"readability counts"
答案 2 :(得分:2)
这是工作代码(我无法帮助,即使@Hamidi说“我们不会为你编写程序”;)
import re
PAT = re.compile(r'\[(?P<time>[^\]]+)\] \[(?P<level>[^\]]+)\] \[(?P<client>[^\]]+)\] (?P<message>\S+)')
LEVELS = ['critical', 'error', 'warning', 'info', 'debug']
def level_number(line):
match = PAT.match(line)
if match:
level = PAT.match(line).groupdict()['level']
return LEVELS.index(level)
return len(LEVELS)
with open('log.txt') as f:
result = sorted(f, key=level_number)
注意,我在每个部分都包含了正则表达式组(这可能会方便进一步处理)。 HTH。