如何在Python中访问JSON文件中的指定字典?
解决方法
一、先修正JSON文件的合法性问题
你当前的JSON文件格式不合法——JSON规范要求只能有一个顶级元素(要么是对象,要么是数组),而你直接把两个独立字典并列,导致标准json.load无法解析。下面分两种场景处理:
场景1:能重新生成合法的JSON文件
如果还能重新生成文件,推荐以下两种写法:
方案A:合并成一个大字典(最方便后续访问)
把所有平台的信息整合到一个顶级字典里,用平台名称作为键:
import json # 原始的两个平台字典 amazon_info = {"email": "someone@amazon.com", "password": "123456"} so_info = {"email": "somebody@stackoverflow.com", "password": "password"} # 合并为一个大字典 all_accounts = { "Amazon": amazon_info, "Stack Overflow": so_info } # 写入文件(注意用"w"写入模式,不是"r"只读模式) with open("file.json", "w") as f: json.dump(all_accounts, f, indent=4)
生成的合法JSON如下:
{ "Amazon": { "email": "someone@amazon.com", "password": "123456" }, "Stack Overflow": { "email": "somebody@stackoverflow.com", "password": "password" } }
后续访问直接通过键名定位:
import json with open("file.json", "r") as f: accounts = json.load(f) # 获取Amazon的邮箱 print(accounts["Amazon"]["email"]) # 获取Stack Overflow的密码 print(accounts["Stack Overflow"]["password"])
方案B:存为JSON数组
如果想保留独立字典的结构,就把它们放到数组里:
import json account_list = [ {"Amazon": {"email": "someone@amazon.com", "password": "123456"}}, {"Stack Overflow": {"email": "somebody@stackoverflow.com", "password": "password"}} ] with open("file.json", "w") as f: json.dump(account_list, f, indent=4)
生成的JSON数组:
[ { "Amazon": { "email": "someone@amazon.com", "password": "123456" } }, { "Stack Overflow": { "email": "somebody@stackoverflow.com", "password": "password" } } ]
访问时可以按索引或遍历查找:
import json with open("file.json", "r") as f: accounts = json.load(f) # 按索引取第一个字典(Amazon) print(accounts[0]["Amazon"]["password"]) # 遍历查找Stack Overflow的信息 for item in accounts: if "Stack Overflow" in item: print(item["Stack Overflow"]["email"])
场景2:已有不合法的JSON文件,直接处理
如果没办法重新生成文件,可以用json.JSONDecoder的raw_decode方法逐个解析顶级对象:
import json account_list = [] with open("file.json", "r") as f: decoder = json.JSONDecoder() content = f.read().strip() pos = 0 # 循环解析每个顶级字典 while pos < len(content): obj, pos = decoder.raw_decode(content, pos) account_list.append(obj) # 跳过字典间的空白字符 while pos < len(content) and content[pos].isspace(): pos += 1 # 现在account_list里就是两个字典 print(account_list[0]["Amazon"]["email"]) print(account_list[1]["Stack Overflow"]["password"])
二、补充注意点
你之前写的json.dump(my_dict, open("file.json", "r"), indent=4)有个低级错误:写入文件必须用"w"(写入)模式,而不是"r"(只读)模式,否则会直接抛出权限错误。
内容的提问来源于stack exchange,提问作者lvjsmn
相关产品推荐
相关产品推荐

