gpt4 book ai didi

python 使用 Pyyaml 并保持格式

转载 作者:太空宇宙 更新时间:2023-11-03 21:19:15 25 4
gpt4 key购买 nike

这是一个配置文件,我使用 PyYAML 更改其中的一些值,然后编写一些配置,但它会更改我的格式,这让我感到困惑。

 $ results.yaml 
nas:
mount_dir: '/nvr'
mount_dirs: ['/mount/data0', '/mount/data1', '/mount/data2']

# yaml.py

import yaml.py

conf = open("results.conf", "r")
results = yaml.load(conf)
conf.close()

result['nas']['mount_dirs'][0]= "haha"

with open('/home/zonion/speedio/speedio.conf', 'w') as conf:
yaml.dump(speedio, conf, default_flow_style=False)

conf.close()

但是它改变了我的格式,我该怎么办?

# cat results.conf
nas:
mount_dir: /nvr
mount_dirs:
- haha
- /mount/data1
- /mount/data2

最佳答案

如果您使用ruamel.yaml 1,通过组合this,您可以相对轻松地实现这一点和 this在 StackOverlow 上回答。

默认情况下,ruamel.yaml 规范化为缩进 2,并删除多余的引号。由于您似乎不希望这样做,因此您必须显式设置缩进,或者让 ruamel.yaml 分析输入,并告诉它保留引号:

import sys
import ruamel.yaml
import ruamel.yaml.util

yaml_str = """\
nas:
mount_dir: '/nvr'
mount_dirs: ['/mount/data0', '/mount/data1', '/mount/data2']
"""

result, indent, block_seq_indent = ruamel.yaml.util.load_yaml_guess_indent(
yaml_str, preserve_quotes=True)
result['nas']['mount_dirs'][0] = "haha"
ruamel.yaml.round_trip_dump(result, sys.stdout, indent=indent,
block_seq_indent=block_seq_indent)

您可以执行以下操作来代替 load_yaml_guess_indent() 调用:

result = ruamel.yaml.round_trip_load(yaml_str, preserve_quotes=True)
indent = 4
block_sequence_indent = None

如果您希望 haha 在输出中被(单)引用,请将其设为 SingleQuotedScalarString:

result['nas']['mount_dirs'][0] = \
ruamel.yaml.scalarstring.SingleQuotedScalarString("haha")

输出将是:

nas:
mount_dir: '/nvr'
mount_dirs: ['haha', '/mount/data1', '/mount/data2']

(假设您的简短示例输入没有 block 样式序列,则无法确定 block_sequence_indent 并且将为 None)

<小时/>

使用较新的 API 时,您可以分别控制映射和序列的缩进:

yaml = ruamel.yaml.YAML()
yaml.indent(mapping=4, sequence=6, offset=3) # not that that looks nice
data = yaml.load(some_stream)
yaml.dump(data, some_stream)

这将使您的 YAML 格式保持一致(如果一开始并非如此),并且在第一次往返后不再进行任何更改。

<小时/>

1 免责声明:我是该包的作者。

关于python 使用 Pyyaml 并保持格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54430641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com