代码之家  ›  专栏  ›  技术社区  ›  David

如何使用python附加到yaml文件

  •  0
  • David  · 技术社区  · 5 年前

    我有一个叫yaml的文件 data.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 package/s在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)
    

    方法 安全转储 覆盖文件内容,我只将其视为新的文件内容!

    '002':
      name: Lisa
      email: lisa@test.com
      numbers: 
        - 000-111-2222
        - 000-111-2223
    
    1 回复  |  直到 5 年前
        1
  •  2
  •   Anthon Rujikin    5 年前

    一般来说,您不能通过编写额外的 文件末尾的信息。这种方法适用于 块样式的顶层映射或序列,但甚至 然后简单地附加只能用于某些文档的情况。

    很容易将yaml加载到python数据结构中, 更新/扩展该结构,然后将其转储回去。这样你就不会 必须处理可能的重复密钥、非裸文档和 其他问题会导致使用Simple时yaml无效 追加。假设您的原始文件称为 input.yaml , the 以下是技巧:

    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