JSON в YAML в Python: как получить правильные манипуляции со строками? - PullRequest
1 голос
/ 23 апреля 2019

Я использую библиотеку PyYAML для преобразования json в yaml.Но кавычки удаляются из строковых значений, когда их не должно быть.Их следует удалять только из ключей.

Я использовал опцию default_flow_style с функцией дампа yaml, как показано ниже:

import yaml

x = {'name':'Alice','location':'New York', 'profession':'coder'}
yaml.dump(x, default_flow_style=False)

Фактический результат:
'location: New York\nname: Alice\nprofession: coder\n'

Когда желаемый результат:
"location: 'New York'\nname: 'Alice'\nprofession: 'coder'\n"

1 Ответ

1 голос
/ 23 апреля 2019

Библиотека PyYAML, которую вы используете, не всегда дает вам это вид контроля. Он отбрасывает первоначальную цитату, если вы лишние, когда вы загрузить-затем-сбросить YAML (версия 1.1) вместе с ним. И если вы укажете default_style='"' каждая строка заключена в кавычки, включая ключи.

ruamel.yaml (отказ от ответственности: я являюсь автором этого пакета) может сделать это вид обхода, позволяя вам сохранить ваши конкретные и / или лишние цитаты. Его механизм, чтобы сделать это, предоставляет вам типы что вы можете использовать из коробки.

Благодаря Дэвид Фрейзер Вы также можете легко получить ключи сопоставления без кавычек, в то время как все остальные - в двойных кавычках:

import sys
import ruamel.yaml


def non_quoted_key(self, data):
   if isinstance(data, ruamel.yaml.compat.string_types):
       data = ruamel.yaml.scalarstring.PlainScalarString(data)
   return self.represent_data(data)

x = {'name':'Alice', 'location':'New York', 'profession':'coder'}
yaml = ruamel.yaml.YAML()
yaml.default_flow_style = False
yaml.default_style = '"'
yaml.Representer.represent_key = non_quoted_key
yaml.dump(x, sys.stdout)

, что дает:

name: "Alice"
location: "New York"
profession: "coder"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...