Python加载YAML文件至dict并保留原始顺序的正确方法
在Python中加载YAML并保留原始顺序(Python3.6+)
刚好Python3.6及以上版本的字典已经默认支持插入顺序保留(Python3.7更是把这一点写入了官方规范),所以现在实现起来非常简单,不需要再依赖过时的OrderedDict方案了。下面是具体的步骤:
1. 确保安装PyYAML
首先需要安装处理YAML的库:
pip install pyyaml
2. 使用safe_load加载YAML文件
PyYAML的safe_load方法是推荐的加载方式(避免load方法的安全风险),它在Python3.6+环境下会自动用原生的dict来解析YAML中的映射结构,而这个dict会严格保留YAML文件里的键顺序。
举个例子,假设我们有一个config.yaml文件:
database: host: localhost port: 5432 username: admin password: secret
加载代码如下:
import yaml # 打开并加载YAML文件 with open('config.yaml', 'r', encoding='utf-8') as f: config = yaml.safe_load(f) # 验证顺序:打印出来的键顺序会和YAML里的完全一致 print(list(config['database'].keys())) # 输出: ['host', 'port', 'username', 'password']
为什么不用OrderedDict了?
在Python3.6之前,原生dict是无序的,所以当时需要用yaml.Loader配合OrderedDict来保留顺序。但现在Python3.6+的dict已经在实现(3.6)和规范(3.7)层面保证了插入顺序,PyYAML在解析时会按YAML文件的顺序插入键到dict中,自然就保留了原始顺序。
额外说明:如果需要更明确指定映射类型
如果你想显式告诉PyYAML用原生dict来构造映射(其实默认就是这样),可以自定义构造器,但这一步不是必需的:
from yaml import SafeLoader # 自定义构造器,用dict来解析YAML映射 def dict_constructor(loader, node): return dict(loader.construct_pairs(node)) # 注册构造器 SafeLoader.add_constructor('tag:yaml.org,2002:map', dict_constructor) # 加载文件 with open('config.yaml', 'r', encoding='utf-8') as f: config = yaml.load(f, Loader=SafeLoader)
内容的提问来源于stack exchange,提问作者waldelb




