如何从API生成的特殊格式字典文件中提取值并遍历键?
解析含Python对象的非标准字典数据并提取字段
看起来你遇到的问题是这个数据文件是Python字典的字符串表示,但包含了非字面量的Python对象(比如<object at 0xc0>和re.compile(...)),所以常规的JSON或ast.literal_eval方法都处理不了。下面给你几个可行的解决方案:
方案1:用exec解析(适合需要完整字典的场景)
这个方法会把字符串转换成真实的Python字典,但需要先处理掉非法的语法(比如<object at 0xc0>)。注意:只在你完全信任这个文件内容的情况下使用,因为exec会执行任意代码。
import re with open("file.json", "r") as f: data_str = f.read() # 把无法解析的<object at ...>替换成None(或其他你需要的占位符) processed_data = re.sub(r"<object at 0x\w+>", "None", data_str) parsed_dict = {} # 执行字符串代码,把结果赋值给parsed_dict exec(f"parsed_dict = {processed_data}") # 提取number字段 print(parsed_dict['store']['number']) # 输出7 # 遍历所有键 for key in parsed_dict: print(f"键: {key}, 值: {parsed_dict[key]}")
方案2:用正则直接提取目标字段(安全且简单,适合只需要特定字段的场景)
如果你只需要number的值,没必要解析整个字典,直接用正则匹配提取即可:
import re with open("file.json", "r") as f: data_str = f.read() # 匹配'number': 后面的数字 match_result = re.search(r"'number':\s*(\d+)", data_str) if match_result: number = int(match_result.group(1)) print(number) # 输出7
为什么你的之前尝试失败?
让我帮你分析一下每个尝试的问题:
- 尝试#1:你把字符串
"file.json"当成了文件对象调用read(),正确的做法是先通过open()打开文件,再调用read()。 - 尝试#2:
ast.literal_eval只能解析Python字面量(字符串、数字、列表、字典等),但你的数据里有<object at 0xc0>(不是合法的Python语法)和re.compile(...)(函数调用,不是字面量),所以会抛出语法错误。 - 尝试#3:把单引号换成双引号后,
<object at 0xc0>和re.compile(...)依然不是合法的JSON格式(JSON不支持Python特定的对象语法),所以json.loads失败。 - 尝试#4:
json.dumps(data)只是把原始字符串转成JSON格式的字符串,并没有处理原始数据的格式问题,之后再调用json.loads(data)还是在处理原来的非法JSON字符串,自然失败。
内容的提问来源于stack exchange,提问作者user15109593
相关产品推荐
相关产品推荐

