我正在尝试将数据从这样的字符串添加到 foo.yaml:
foo.yaml
# other stuff in the file
packages: # doesn't have to exist
- 1
- 2
- 3
# other stuff in the file
绳子
packages:
- 4
- 5
这两个文件的格式并不总是相同。我不能只附加其他内容,因为
packages:
组可能已经存在,如果存在,则不必位于文件末尾。
我尝试仅附加到文件中,但我意识到它不起作用,因为
packages:
可能已经存在。另外,当我尝试像这样追加时,字符串中的换行符会作为 \n
符号而不是实际的换行符写入文件。
您不应该为此使用 PyYAML。它仅支持 YAML 1.1 规范,该规范已于 2009 年过时。 PyYAML 也很乐意删除 YAML 文件中的所有注释。
使用
ruamel.yaml
加载两个文件并使用 setdefault 更新第一个文件
并延伸以应对
packages
可能在第一个文件中不可用:
import sys
import ruamel.yaml
from pathlib import Path
yaml = ruamel.yaml.YAML()
yaml.indent(sequence=4, offset=2)
yaml.preserve_quotes = True
foo = yaml.load(Path('foo.yaml'))
extra = yaml.load(Path('extra.yaml'))
# optionally move comment
if 'packages' in foo:
fpc = foo['packages'].ca
l = len(foo['packages']) - 1
if l in fpc.items:
le = len(extra['packages']) + l
foo['packages'].ca.items[le] = fpc.items.pop(l)
foo.setdefault('packages', []).extend(extra['packages'])
yaml.dump(foo, sys.stdout)
给出:
# other stuff in the file
packages: # doesn't have to exist
- 1
- 2
- 3
- 4
- 5
# other stuff in the file
第二个
# other stuf in the file
注释附加到序列的最后一个元素。
扩展从该序列加载的列表不会移动注释、可选的
那里的代码将显式地将其移动到新序列的末尾。
ruamel.yaml
的作者