Dicts становятся OrderedDicts с файлами yaml

Я пытаюсь записать что-то в файл .yaml, но меня смущает документация. Там сказано следующее:

Block mapping can be nested:

# YAML
hero:
  hp: 34
  sp: 8
  level: 4
orc:
  hp: 12
  sp: 0
  level: 2

# Python
{'hero': {'hp': 34, 'sp': 8, 'level': 4}, 'orc': {'hp': 12, 'sp': 0, 'level': 2}}

Итак, я пытаюсь получить аналогичный результат с файлом yaml, который в итоге выглядит так:

User1:
  name: 'name1'
  id: 001
  strikes: 1
User2:
  name: 'name2'
  id: 002
  strikes: 3

Когда я пытаюсь использовать то, что было использовано в примере из документации, это приводит к следующему:

User1: {id: '001', name: name1, strikes: 1}
User2: {id: '002', name: name2, strikes: 3}

Для этого я использовал следующий код:

strikes = {'User1': {'name': 'name1', 'id': '001', 'strikes': 1}, 'User2': {'name': 'name2', 'id': '002', 'strikes': 3}}

with open(path + "/strikes.yml", 'w+') as stream:
    yaml.dump(strikes, stream)

Это на самом деле проблема? Вы можете взаимодействовать с OrderedDict так же, как и с обычным dict.

jonrsharpe 01.05.2018 13:33

Ну, я в основном пытаюсь написать файл yaml с помощью python, чтобы он полученные результаты в примере yaml из документов

Lithimlin 01.05.2018 13:35

Но вы спрашиваете о поведении, когда вы читать из файла, не так ли? Вы действительно пробовали писать, из ванильных словарей или заказных? Было ли это проблемой, не считая проблем с оформлением заказа в первом случае? Дайте минимальный воспроизводимый пример.

jonrsharpe 01.05.2018 13:36

Да, прости. Теперь я понимаю, что мой вопрос не очень ясен. Дай мне время исправить это, пожалуйста.

Lithimlin 01.05.2018 13:38

Отредактировал мой вопрос, чтобы быть более ясным, надеюсь

Lithimlin 01.05.2018 13:45

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

jonrsharpe 01.05.2018 13:46

Однако цитируемые документы - единственные, которые я смог найти, так как github ссылается только на них.

Lithimlin 01.05.2018 13:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
7
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

PyYAML по умолчанию записывает составные листовые узлы в потоковом стиле, а остальные - в блочном стиле.

Если вы этого не хотите, т.е. хотите, чтобы все было в блочном стиле, используйте safe_dump(data, default_flow_style=False):

import sys
import yaml


strikes = {'User1': {'name': 'name1', 'id': '001', 'strikes': 1}, 'User2': {'name': 'name2', 'id': '002', 'strikes': 3}}

yaml.safe_dump(strikes, sys.stdout, default_flow_style=False)

дает:

User1:
  id: '001'
  name: name1
  strikes: 1
User2:
  id: '002'
  name: name2
  strikes: 3

Нет причин использовать yaml.dump() вместо yaml.safe_dump() (и я определенно надеюсь, что вы не используете yaml.load() вместо yaml.safe_load())

Большое спасибо. Это решило проблему для меня.

Lithimlin 01.05.2018 13:58

Другие вопросы по теме