如何将类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
相关产品推荐
相关产品推荐

