【问题标题】:Dump a yaml file to disk using ruamel使用 ruamel 将 yaml 文件转储到磁盘
【发布时间】:2021-12-17 13:54:14
【问题描述】:

我在修改已保存的 YAML 文件时遇到了困难。我想加载它,向字典添加一个属性,然后重新保存它。这就是我所做的......(Python 3.9.7)

# my_file.yaml

- id: 001
  name: Steve
  likes:
    - soccer
    - steak
- id: 002
  name: Mary
  likes:
    - tennis
    - ice cream
from ruamel.yaml import YAML

with open("my_file.yaml") as file:
  yaml = YAML()
  l = yaml.load(file)
l[0]["address"] = "123 Street"
with open("my_file_new.yaml", 'w') as f:
  yaml.dump(l, f)

输出太长,无法包含,但这绝对不是我所期望的。

如何获取仅添加一行的原始文件?

【问题讨论】:

    标签: python yaml ruamel.yaml


    【解决方案1】:

    您可能希望使用字符串作为open() 的第一个参数,但您可能不会 正在这样做 在第二次调用中,如 从您的代码中不清楚您的变量 my_new_file 是在哪里声明的,以及它有什么 属性.yaml

    而是提供一个字符串作为open() 的第一个参数,当您使用它时, 始终以二进制形式打开 YAML 文档('rb''wb'), 或(最好)使用pathlib.Path():

    import pathlib
    from ruamel.yaml import YAML
    old_path = pathlib.Path('my_file.yaml')
    new_path = pathlib.Path('my_file_new.yaml')
    
    yaml = YAML()
    with open('my_file.yaml') as file:
      l = yaml.load(file)
    # replace the previous two lines with: l = yaml.load(l, old_path)
    
    l[0]['address'] = '123 Street'
    with open('my_file_new.yaml', 'wb') as f:
      yaml.dump(l, f)
    # replace the previous two lines with: yaml.dump(l, new_path)
    
    print(new_path.read_text())
    

    给出:

    # my_file.yaml
    
    - id: 001
      name: Steve
      likes:
      - soccer
      - steak
      address: 123 Street
    - id: 002
      name: Mary
      likes:
      - tennis
      - ice cream
    

    【讨论】:

    • 我知道我做了什么:yaml = YAML() 不适用于 write 方法。谢谢!
    • 并且目标文件应该是一个字符串。我已经更正了。
    猜你喜欢
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 2020-05-23
    • 2019-09-08
    相关资源
    最近更新 更多