You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:02:32