Python P4:字典——给数据贴标签,按名字取值
P3 的日志巡检脚本里,我们用 parts[2] 取级别、parts[1] 取时间——靠位置(第几个)拿数据。位置有个毛病:得数,得记,数错了就全错。
字典换了一种思路:不记位置,记名字。info["级别"] 直接拿到级别,一眼就懂。这篇把字典讲透。
一、字典长什么样
server = {"ip": "3.15.231.19", "os": "Debian", "memory": "8G"}
花括号
{}包起来的是字典(P2 的括号全家桶讲过:括号定类型)里面是键值对,
键: 值,冒号分隔,逗号分隔多对"ip"是键(key,标签),"3.15.231.19"是值(value,抽屉里的东西)
想象一台贴了标签的抽屉柜:想拿 IP?不用数第几个抽屉,直接喊"ip"那格。
字典 vs 列表
日志拆出来的 parts 是列表(顺序固定);一台服务器的配置是字典(ip、系统、内存各有名字)。
二、取值:按键名
server["ip"] # '3.15.231.19'
server["os"] # 'Debian'
[] 是取值标记(P3 讲过),跟在字典后面就是"按标签拿"。
注意:server["ip"] 括号里是写死的字符串 "ip";也可以放变量:
key = "ip"
server[key] # 等于 server["ip"]
括号里放表达式,先算出值再用——key 是 "ip" 时,它就是 server["ip"]。
查不到怎么办:KeyError 和 .get()
server["cpu"] # KeyError: 'cpu' ——掀桌子报错
字典里没有 cpu 这个键,用 [] 查会报 KeyError。写脚本时配置项可能缺失,不能让程序动不动崩——用 .get():
server.get("cpu") # None,不报错
server.get("cpu", "未知") # '未知',自带备胎
.get(键, 备胎):查到返回值,查不到返回备胎(不写备胎就是 None)。查配置、查日志字段,永远用 .get()。
三、增、改、删
server["region"] = "美西" # 加:没有这个键就新建
server["memory"] = "16G" # 改:有这个键就覆盖
del server["region"] # 删:整个键值对拿掉
server["region"] = "美西" 一行两用:键存在就是改,不存在就是加。del 是删除,删完再查就 KeyError 了。
四、字典的特点
键必须唯一:写两个
"ip",后写的覆盖先写的键必须是不可变的东西:字符串、数字可以;列表、字典不能当键(它们会变,标签不能变)
值随便装:字符串、数字、列表、甚至再套一个字典都行
可变:随时加、改、删
查找快:不管多大,按键取值都是一步到位——这就是它叫"字典"的原因,跟查词典一样
嵌套字典:柜子里再套柜子
servers = {
"web1": {"ip": "1.1.1.1", "os": "Debian"},
"db1": {"ip": "2.2.2.2", "os": "Ubuntu"},
}
servers["web1"]["ip"] # '1.1.1.1'
servers["web1"] 拿到内层字典,再 ["ip"] 拿到 IP。多台服务器的配置就这么管。
五、遍历字典
server = {"ip": "3.15.231.19", "os": "Debian", "memory": "8G"}
for key in server:
print(key, server[key])
输出:
ip 3.15.231.19
os Debian
memory 8G
for 直接遍历字典,默认只抓键。值要自己查:server[key]。
三兄弟,想抓什么点什么:
list(server.keys()) # ['ip', 'os', 'memory'],只看标签
list(server.values()) # ['3.15.231.19', 'Debian', '8G'],只看值
list(server.items()) # [('ip', '3.15.231.19'), ...],键值对
最顺手的写法——.items() 一次抓一对:
for key, value in server.items():
print(key, value)
for key, value in 左右手各接一个,一轮就齐,不用再查一遍。
in 也能查键
"ip" in server # True
"cpu" in server # False
"x" in 字典 查的是键在不在。配合 if 做配置检查:
if "ip" in server:
print(f"准备连接 {server['ip']}")
六、综合实战:函数返回字典
P2 的 parse_log 返回的是一句话,调用者还得再拆。改成返回字典,调用者直接按名字取:
def parse_log(log):
parts = log.split()
return {"date": parts[0], "time": parts[1], "level": parts[2]}
info = parse_log("2026-10-14 10:23:45 ERROR /var/log disk full")
print(info["level"]) # ERROR
print(info["time"]) # 10:23:45
函数吐出结构化数据,调用者按名字取——这是脚本里最常见的配合。函数本身 P5 细讲。
再进一步,批量解析:
logs = [
"2026-10-14 10:23:45 INFO 服务启动",
"2026-10-14 10:24:01 ERROR 磁盘满了",
"2026-10-14 10:25:10 ERROR 连接超时",
]
for log in logs:
info = parse_log(log)
if info["level"] == "ERROR":
print(f"[{info['time']}] {log}")
for 遍历 → 函数解析成字典 → if 按级别筛选。P2+P3+P4 在这里会师。
七、排错小技巧:repr 看真相
手机上写代码如果遇到中文键值对不上,先别怀疑 Python:
print(repr(server))
repr() 把字符串的真实面目打印出来,空格、看不见的字符都现形。显示乱了数据未必乱,先看真相再下结论。
小结
下一课 P5:函数——def、调用、参数、return,一次讲透。