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

如何将类Python字典字符串转为Python字典并导出为YAML?

解决方案

1. 先将类Python字符串转为合法Python字典

ast.literal_eval失败通常是因为字符串存在语法兼容问题,比如JSON风格的小写布尔值/空值、非标准符号等,先做预处理适配Python语法:

  • 把true替换为True,false替换为False,null替换为None
  • 确认数组用[]包裹,而非其他符号
  • 检查并修正括号不匹配、引号未闭合等基础语法错误

示例代码:

import ast

raw_str = """{'group': [{'name': 'test1', 'id': 1}, {'name': 'test2', 'id': 2}], 'enabled': true}"""
# 预处理适配ast语法规则
processed_str = raw_str.replace('true', 'True').replace('false', 'False').replace('null', 'None')
try:
    data = ast.literal_eval(processed_str)
except SyntaxError as e:
    print(f"语法错误定位: {e}")
    # 根据错误提示手动修正字符串中的问题,比如补全闭合引号、调整括号

2. 用ruamel.yaml正确导出YAML(保留列表+允许重复键)

开启allow_duplicate_keys=True后仍出现列表被识别为映射的问题,大概率是原字典结构有误,先确认转换后的data中数组对应的类型是list而非dict(比如用print(type(data['group']))验证)。确认结构正确后,用以下代码导出:

from ruamel.yaml import YAML

yaml = YAML()
yaml.allow_duplicate_keys = True  # 允许重复键存在
yaml.default_flow_style = False  # 使用块风格输出,避免列表被压缩为行内格式

# 导出到YAML文件
with open('result.yaml', 'w', encoding='utf-8') as f:
    yaml.dump(data, f)

3. 处理极端非标准语法

如果原字符串存在特殊格式(比如用{}包裹数组),可以用正则表达式针对性修正:

import re

# 仅当确定{数字/字符串, ...}是数组时,替换为[]格式
processed_str = re.sub(r'\{([a-zA-Z0-9, .]+)\}', r'[\1]', processed_str)

内容的提问来源于stack exchange,提问作者Vimo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:45:43