You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动