加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 转储解析文档时是否可以保留YAML块结构?

发布时间:2020-12-16 23:41:18 所属栏目:Python 来源:网络整理
导读:我们使用PyYAML为不同的环境准备配置文件.但是我们的YAML阻止了完整性. 给input.yml … pubkey: | -----BEGIN PUBLIC KEY----- MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NP
我们使用PyYAML为不同的环境准备配置文件.但是我们的YAML阻止了完整性.

给input.yml …

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

…使用python3执行此程序…

import yaml

with open('input.yml',mode='r') as f:
    parsed = yaml.safe_load(f)

with open('output.yml',mode='w') as f:
    yaml.dump(parsed,f)

…产生这个output.yml …

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

    MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq

    QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2

    UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK

    EsUgJHXcpw7OPxRrCQIDAQAB

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

    '

是否可以使用PyYAML保留块的结构?

解决方法

是的,可以使用pyyaml,但你必须提供自己的增强版本,至少是safe_load使用的Scanner,Parser和Constructor,dump使用的Emitter,Serializer和Representer,
并提供一个专门的类似字符串的类,用于保存有关其原始格式的信息.

这是添加到ruamel.yaml(免责声明:我是该软件包的作者)的一部分,因为它是从PyYAML派生的,并且仍然保持类似的设置.使用ruamel.yaml:

import ruamel.yaml as yaml

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

data = yaml.load(yaml_str,Loader=yaml.RoundTripLoader)
print(yaml.dump(data,Dumper=yaml.RoundTripDumper,indent=4))

给你:

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

至少使用Python 2.7和3.5.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读