如何使用python附加到YAML文件

时间:2019-02-11 09:05:22

标签: python python-3.x parsing yaml ruamel.yaml

我有一个名为data.yaml的YAML文件:

---
'001':
  name: Ben
  email: ben@test.com

我想要一个更新的文件,如下所示:

---
'001':
  name: Ben
  email: ben@test.com
'002':
  name: Lisa
  email: lisa@test.com
  numbers: 
    - 000-111-2222
    - 000-111-2223

如何使用yaml包在python中实现此目标?

编辑:

我尝试过:

import yaml
import io

data = {'002': {'name': 'Lisa', 'email': 'lisa@test.com', 'numbers': ['000-111-2222', '000-111-2223']}}

with io.open('data.yaml', 'w', encoding='utf8') as outfile:
    yaml.safe_dump(data, outfile, default_flow_style=False, allow_unicode=True)

方法 safe_dump 会覆盖文件内容,我只能将其视为新文件内容!

'002':
  name: Lisa
  email: lisa@test.com
  numbers: 
    - 000-111-2222
    - 000-111-2223

1 个答案:

答案 0 :(得分:2)

通常,您可以只写一些额外的代码就不能将其添加到文件中的YAML文档中 该文件末尾的信息。此migth适用于具有以下内容的YAML文档 顶层的块映射或序列,甚至 那么仅附加文件仅适用于某些情况下的文件。

将YAML加载到Python数据结构很容易, 更新/扩展该结构,然后将其转回。这样你就不会 必须处理潜在的重复密钥,非裸露的文件和 使用简单时会导致无效YAML的其他问题 附加。假设您的原始文件称为input.yaml, 以下是窍门:

import sys
from pathlib import Path
import ruamel.yaml

file_name = Path('input.yaml')

record_to_add = dict(name='Lisa', email='lisa@test.com', numbers=['000-111-2222', '000-111-2223'])

yaml = ruamel.yaml.YAML()
yaml.explicit_start = True
data = yaml.load(file_name)
data['002'] = record_to_add
yaml.dump(data, sys.stdout)

给出:

---
'001':
  name: Ben
  email: ben@test.com
'002':
  name: Lisa
  email: lisa@test.com
  numbers:
  - 000-111-2222
  - 000-111-2223