如何使用 PyYAML 将输出“合并”到现有 YAML 文件中?

问题描述 投票:0回答:1

我正在尝试将数据从这样的字符串添加到 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
符号而不是实际的换行符写入文件。

python yaml pyyaml
1个回答
0
投票

您不应该为此使用 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

的作者
© www.soinside.com 2019 - 2024. All rights reserved.