Python3加载YAML时强制字典键为字符串的方法咨询
让PyYAML加载字典时始终使用字符串键
这个问题我之前处理过,PyYAML的自动类型推断虽然省心,但碰到数字键这类场景确实会打乱我们预期的键类型。下面给你两个实用的解决办法:
方法一:自定义构造器(推荐,支持嵌套字典)
这个方案会替换PyYAML默认的映射解析逻辑,对所有层级的字典键生效,非常适合复杂的业务数据:
import yaml def string_key_dict_constructor(loader, node): # 深度加载所有层级的映射结构 raw_mapping = loader.construct_mapping(node, deep=True) # 遍历键值对,强制把每个键转成字符串 return {str(key): value for key, value in raw_mapping.items()} # 注册自定义构造器,覆盖默认的字典解析规则 yaml.add_constructor( yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, string_key_dict_constructor ) # 测试你的示例文本 txt = """ --- one: 1 2: two """ # 加载YAML数据 parsed_data = yaml.load(txt, Loader=yaml.FullLoader) print(parsed_data) # 输出: {'one': 1, '2': 'two'}
原理说明
- 自定义的构造函数会先让PyYAML完成基础的映射加载,再统一处理所有键的类型,确保不管原始YAML里的键是数字还是其他类型,最终都转为字符串。
construct_mapping(node, deep=True)参数保证嵌套的子字典也会被递归处理,深层的数字键同样能被转换。
方法二:加载后手动转换(适合简单场景)
如果你的YAML结构比较扁平,没有多层嵌套,也可以在加载完成后直接遍历转换:
import yaml txt = """ --- one: 1 2: two """ # 先按默认规则加载数据 raw_data = yaml.load(txt, Loader=yaml.FullLoader) # 批量转换顶层键为字符串 string_key_data = {str(k): v for k, v in raw_data.items()} print(string_key_data) # 输出: {'one': 1, '2': 'two'}
注意事项
- 这个方法只处理顶层字典的键,如果有嵌套字典,需要自己写递归逻辑来处理,不如方法一高效。
- 如果YAML中的键是复杂类型(比如列表、字典),转成字符串可能会得到不太直观的结果,但你的场景是数字键转字符串,完全适用。
内容的提问来源于stack exchange,提问作者mogul
相关产品推荐
相关产品推荐

