代码之家  ›  专栏  ›  技术社区  ›  Yoann Pageaud

python 3.5-如何在yaml中打印带双引号的值?

  •  2
  • Yoann Pageaud  · 技术社区  · 7 年前

    我想打印一个yaml文件(带有键和值)和一些双引号之间的值。 我想使用这里提供的解决方案: How to print a value with double quotes and spaces in YAML?

    不幸的是,当我为python 3.5安装ruamel.yaml时( sudo apt install python3-ruamel.yaml 我无法在脚本SalaStrug.Py中找到DuffQuoDeQualAdStRung()函数。 下面是它的样子:

    from __future__ import absolute_import
    from __future__ import print_function
    
    __all__ = ["ScalarString", "PreservedScalarString"]
    
    try:
        from .compat import text_type
    except (ImportError, ValueError):  # for Jython
        from ruamel.yaml.compat import text_type
    
    
    class ScalarString(text_type):
        def __new__(cls, *args, **kw):
            return text_type.__new__(cls, *args, **kw)
    
    
    class PreservedScalarString(ScalarString):
        def __new__(cls, value):
            return ScalarString.__new__(cls, value)
    
    
    def preserve_literal(s):
        return PreservedScalarString(s.replace('\r\n', '\n').replace('\r', '\n'))
    
    
    def walk_tree(base):
        """
        the routine here walks over a simple yaml tree (recursing in
        dict values and list items) and converts strings that
        have multiple lines to literal scalars
        """
        from ruamel.yaml.compat import string_types
    
        if isinstance(base, dict):
            for k in base:
                v = base[k]
                if isinstance(v, string_types) and '\n' in v:
                    base[k] = preserve_literal(v)
                else:
                    walk_tree(v)
        elif isinstance(base, list):
            for idx, elem in enumerate(base):
                if isinstance(elem, string_types) and '\n' in elem:
                    print(elem)
                    base[idx] = preserve_literal(elem)
                else:
                    walk_tree(elem)
    

    目前这是我在使用ruamel.yamp.dump()获取我的yaml文件时获得的:

    key1: 0,0,0,0
    key2: 0,0,0,0
    

    下面是我想要的yaml文件:

    key1: "0,0,0,0"
    key2: "0,0,0,0"
    

    我该怎么解决这个问题呢?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Anthon    7 年前

    这个 DoubleQuotedScalarString 增加了。

    你应该更新你的版本 ruamel.yaml 例如,使用pip安装-u ruamel.yaml。您可以通过查看 __init__.py yaml 目录。当前版本(2018年6月)有:

    version_info=(0, 15, 37),
    

    一般来说,最好不要在linux下使用包管理器安装额外的python包。相反,为每个要开发的程序创建一个virtualenv,并在这样一个virtualenv中安装该程序所需的所有软件包。

        2
  •  0
  •   Yoann Pageaud    7 年前

    所以我找到了一个快速而肮脏的解决方案来完成anthon的回答:
    首先,anthon是对的,我应该在虚拟环境中工作。用我现在的应用程序,我是懒惰的,所以我没有,这是一个错误。
    我发现 sudo apt install python3-ruamel.yaml 不是在相同的DIR中安装包 sudo pip3 install ruamel.yaml .
    包的版本也不一样,这就是我困惑的原因。
    以下是对我有效的快速而肮脏的解决方案:
    从源复制所有“.py”文件( https://pypi.org/project/ruamel.yaml/#files )在安装ruamel.yaml包的目录中(/my/default/python3 lib/ruamel/yaml/),例如 mv /home/user/Downloads/ruamel.yaml-0.15.38/*.py /my/default/python3-lib/ruamel/yaml/
    它为我解决了这个问题。 正如anthon已经回答的,干净的解决方案是使用虚拟env。