【发布时间】:2021-12-13 04:59:23
【问题描述】:
我正在使用正则表达式来查看文件以检查用户名以及他们的操作是否导致错误(错误表示错误,信息表示成功操作) 我使用嵌套字典来跟踪操作,用户名作为主键,嵌套字典记录了它们生成了多少 INFO 和 ERROR 行。
#!/usr/bin/env python3
import re
users = {}
with open('logfile.txt') as f:
for line in f:
regex_user = r"(INFO|ERROR): .* \((.+)\)$"
"""searches for users and if there message was info or error"""
user = re.serach(regex_user, line)
if user is None:
continue
name = user[2]
cat = user[1]
try:
# Method 1?
users[name][cat] = users[name].get(cat, 0) + 1
# Method 2?
users[name][cat] = users.get(name, {}).get(cat, 0) + 1
except KeyError:
print("Where are my keys?")
我想知道这两种方法中的哪一种(如果有的话)正确地修改了字典以增加相应嵌套键的计数。
输出应如下所示:
{'John': {'INFO': 22, 'ERROR': 3}}
如果日志包含用户 John 的 22 行 INFO 和 3 行 ERROR。
【问题讨论】:
-
如果
users没有键name,那么当您尝试分配给users[name][cat]时,方法2 将产生错误。您可能想查看collections.defaultdict() -
如果
users没有键name,那么当你尝试获取users[name]的值时方法1会产生错误。因此,如果name已经不是users中的键,则两者都不起作用。 -
谢谢,我去看看 collections.defaultdict()
标签: python-3.x dictionary nested