首页 > 解决方案 > 使用 ruamel 将 yaml 文件转储到磁盘

问题描述

我在修改已保存的 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)

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

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

标签: pythonyamlruamel.yaml

解决方案


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

而是提供一个字符串作为 的第一个参数open(),并且当您使用它时,始终以二进制 ( 'rb'resp. 'wb') 形式打开 YAML 文档,或者(最好)使用 a 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

推荐阅读