当转储解析文档时,是否有可能保留YAML块结构?

2024-09-27 00:17:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我们使用PyYAML为不同的环境准备配置文件。但是我们的山药块失去了完整性。在

input.yml。。。在

pubkey: |
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq
    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2
    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK
    EsUgJHXcpw7OPxRrCQIDAQAB
    -----END PUBLIC KEY-----

。。。使用python3执行这个程序。。。在

^{pr2}$

。。。产生这个output.yml。。。在

pubkey: '-----BEGIN PUBLIC KEY-----

    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq

    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2

    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK

    EsUgJHXcpw7OPxRrCQIDAQAB

    -----END PUBLIC KEY-----

    '

有没有可能使用PyYAML保存我的块的结构?在


Tags: keyymlpublicpyyamlbeginpubkeyqtgz2n0fcv
1条回答
网友
1楼 · 发布于 2024-09-27 00:17:50

是的,pyyaml是的,但是您必须至少提供您自己的增强版本,这些版本至少包括safe_load使用的Scanner、Parser和Constructor,dump使用的发射器、序列化程序和Representer, 通过提供一个特殊的类似字符串的类来保存关于它的原始格式的信息。在

这是添加到ruamel.yaml免责声明:我是该包的作者)的一部分,因为它是从PyYAML派生的。使用拉梅尔亚姆勒预折叠的方法是:

import sys
import ruamel.yaml

yaml_str = """\
pubkey: |
      -BEGIN PUBLIC KEY  -
    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq
    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2
    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK
    EsUgJHXcpw7OPxRrCQIDAQAB
      -END PUBLIC KEY  -
"""
yaml = ruamel.yaml.YAML()  # defaults to round-trip
yaml.indent(mapping=4)
data = yaml.load(yaml_str)
yaml.dump(data, sys.stdout)

或者更老的更像PyYAML的样式(您可以设置一些选项限制)

^{pr2}$

这两种方法都能让你:

pubkey: |
      -BEGIN PUBLIC KEY  -
    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq
    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2
    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK
    EsUgJHXcpw7OPxRrCQIDAQAB
      -END PUBLIC KEY  -

至少在Python2.7和3.5+中。在

indent=4是必需的,因为RoundTripDumper默认为两个空格缩进和 文件不被保留(不这样做可以简化对YAML文件的重新缩进)。在

如果您不能切换到ruamel.yaml,那么您应该能够使用它的源代码来提取所需的所有更改,但是如果可以,您还可以使用它的其他功能,如注释和合并密钥名保留。在

相关问题 更多 >

    热门问题