Python 3.5 - Как напечатать значение с двойными кавычками в YAML? - PullRequest
0 голосов
/ 11 июня 2018

Я хотел напечатать файл YAML (с ключами и значениями) и с некоторыми значениями в двойных кавычках.Я хотел использовать решение, предоставленное здесь: Как напечатать значение с двойными кавычками и пробелами в YAML?

К сожалению, когда я установил ruamel.yaml для Python 3.5 (sudo apt install python3-ruamel.yaml) Iне удалось найти функцию DoubleQuotedScalarString () в скрипте scalarstring.py.Вот как это выглядит:

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 ]

0 голосов
/ 13 июня 2018

Итак, я нашел быстрое и грязное решение, чтобы завершить ответ Антона:
Прежде всего, Антон прав, я должен работать в виртуальной среде.С моим текущим приложением мне было лень, поэтому я не сделал, это ошибка.
Я обнаружил, что sudo apt install python3-ruamel.yaml не устанавливал пакет в том же каталоге, что и 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/
Это решило проблему для меня. Как уже ответил Антон, чистое решение состоит в использованиивиртуальный env.

0 голосов
/ 11 июня 2018

Был добавлен класс DoubleQuotedScalarString 2016-07-06.

Вам следует обновить версию ruamel.yaml, например, используя pip install -U ruamel.yaml.Вы можете увидеть, какая у вас версия, взглянув на __init__.py в каталоге yaml.Текущая версия (июнь 2018 г.) имеет:

version_info=(0, 15, 37),

Как правило, лучше не устанавливать дополнительные пакеты python под Linux, используя менеджер пакетов.Вместо этого создайте virtualenv для каждой программы, которую вы хотите разработать, и установите все пакеты, необходимые для этой программы, в таком virtualenv.

...