pyyaml ​​и использование кавычек только для строк

У меня есть следующий файл YAML:

---
my_vars:
  my_env: "dev"
  my_count: 3

Когда я читаю его с помощью PyYAML и снова выгружаю, я получаю следующий вывод:

---
my_vars:
  my_env: dev
  my_count: 3

Код в вопросе:

with open(env_file) as f:
    env_dict = yaml.load(f)
    print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True))

Я пытался использоватьdefault_style параметр:

with open(env_file) as f:
    env_dict = yaml.load(f)
    print(yaml.dump(env_dict, indent=4, default_flow_style=False, explicit_start=True, default_style='"'))

Но теперь я получаю:

---
"my_vars":
  "my_env": "dev"
  "my_count": !!int "3"

Что мне нужно сделать, чтобы сохранить оригинальное форматирование,без делать какие-либо предположения об именах переменных в файле YAML?

 Jeroen Jacobs14 июл. 2016 г., 11:14
Я добавлю дополнительные ключи в словарь в будущем, но раскладка должна быть сохранена.
 Nobilis14 июл. 2016 г., 11:10
Почему бы вам просто не распечатать файл, важно ли использовать словарь в качестве источника того, что вы печатаете, а не сам файл?

Ответы на вопрос(2)

у) с обратной совместимостьюruamel.yaml пакет вместо использования PyYAML, который реализует большую часть YAML 1.1 (2005). (Отказ от ответственности: я являюсь автором этого пакета).

Тогда вы просто указываетеpreserve_quotes=True при загрузке для кругового отключения файла YAML:

import sys
import ruamel.yaml

yaml_str = """\
---
my_vars:
  my_env: "dev"    # keep "dev" quoted
  my_count: 3
"""

data = ruamel.yaml.round_trip_load(yaml_str, preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, sys.stdout, explicit_start=True)

какие выводы (включая сохраненный комментарий):

---
my_vars:
  my_env: "dev"    # keep "dev" quoted
  my_count: 3

После загрузки строки скаляры будут подклассом строки, чтобы иметь возможность разместить информацию о кавычках, но будут работать как обычная строка для всех других целей. Если вы хотите заменить такую ​​строку, хотя (dev вfgw) вы должны привести строку к этому подклассу (DoubleQuotedScalarString отruamel.yaml.scalarstring).

Когда круговое отключениеruamel.yaml по умолчанию сохраняет порядок (путем вставки) ключей.

Правильноэтот ответВы можете сделать что-то вроде этого:

import yaml

# define a custom representer for strings
def quoted_presenter(dumper, data):
    return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='"')

yaml.add_representer(str, quoted_presenter)


env_file = 'input.txt'
with open(env_file) as f:
    env_dict = yaml.load(f)
    print yaml.dump(env_dict, default_flow_style=False)

Тем не менее, это просто перегружает его навсе Типы строк в словаре, поэтому он будет заключать в кавычки и ключи, а не только значения.

Это печатает:

"my_vars":
  "my_count": 3
  "my_env": "dev"

Это то, что вы хотите? Не уверен, что вы подразумеваете под именами переменных, вы имеете в виду ключи?

 Nobilis14 июл. 2016 г., 11:58
Если у вас много свободного времени, то я предлагаю поездку в Ямлдокументация о том, как создавать представительства, а затем внимательно прочитать теги YAMLВот, Есть такжеэтот ответ это обсуждает форк PyYaml и упоминает что-то о сохранении исходного форматирования, также может быть полезно.
 Jeroen Jacobs14 июл. 2016 г., 11:51
Это мне уже очень помогло, спасибо :-) До сих пор не уверен, как я могу применить его только к значениям, а не к ключам.

Ваш ответ на вопрос