Мне не нравится, как "yaml.dump ()" сохраняет свои файлы. Есть ли альтернатива? - PullRequest
1 голос
/ 01 апреля 2011

Я недавно открыл для себя YAML, и он оказался фантастическим форматом для моего проекта (я создаю текстовую RPG).Он обрабатывает все, что мне нужно, безупречно - файлы области (комнаты с descs, выходами, objs, npcs и т. Д.), Файлы сценариев, файлы npc, объектные файлы ... он решает их все!Есть только одна вещь ...

При обновлении значений в этих файлах мне, конечно, нужно записать их обратно на диск, чтобы сохранить изменения.К сожалению, метод dump() от YAML действительно создает беспорядок.Сначала он распределяет по алфавиту все ключи, а затем, кажется, помещает одну пару k: v на строку.Это фактически взяло файл с 5 строками и превратило его в 94 строки.

Я попытался записать объекты YAML обратно на диск, используя write(), но выдает

TypeError:ожидал символьный буферный объект

у меня.Пикл спас бы его, но я думаю, что это разрушило бы YAML-ность данных.Есть ли хороший способ сохранить объект YAML без dump()?Я слышал упоминание о SQLite, будет ли это работать так же, как YAML?У меня практически нет опыта работы с базами данных, но кажется, что объекты YAML в основном являются базами данных.Стоит ли перекодировать все, чтобы использовать SQLite?Легко ли с ним сохранить измененные значения, в отличие от проблемы, с которой я столкнулся сейчас?

Любая помощь здесь была бы полезна.Я очень люблю YAML.Я долго пытался найти способ хранить все данные, которые мне нужны для моей игры, и когда я нашел YAML, он словно светился святым светом, когда хор ангелов пел на них свою славу - чтобы вы могли понятьесли бы я сначала хотел узнать, как сохранить данные YAML на диск без использования dump().Если нет, предложения приветствуются!

Ответы [ 2 ]

1 голос
/ 01 апреля 2011

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

Вы используете YAML в качестве базы данных, но это не база данных. Например, переупорядочение ключей является следствием того факта, что пары key: value представлены в виде словаря Python, который по своей природе неупорядочен.

Вам определенно нужно потратить некоторое время на изучение баз данных.

SQLite - это хорошее место для начала, как и любое другое. Вы также можете посмотреть на Postgres или MySQL. Возможно, вы захотите прочитать руководства для начинающих по SQL и по доступу к базе данных с помощью Python. В Интернете их много.

0 голосов
/ 18 февраля 2014

Можно сохранить порядок с YAML и Python.

Python имеет OrderedDict, а YAML имеет эквивалентное упорядоченное отображение, называемое omap .

К сожалению, когда вы выгружаете OrderedDict с YAML, он пытается сохранить объектный тип Python OrderedDict вместопреобразование его в YAML Omap.Это отчасти потому, что спецификация YAML предназначена для того, чтобы хорошо играть с множеством языков, и технически карта YAML или карта позволяют мне дублировать ключи, как я полагаю (мне пришлось бы исследовать это повторно, но я видел, что это цитируется как«ключевое» различие между YAML и JSON - YAML объявляет, как он обрабатывает дублирующиеся ключи, а JSON этого не делает.)

В любом случае, есть способ сообщить YAML о загрузке данных в OrderedDict и выгрузкеOrderedDict последовательно в карту или omap.Самый краткий источник, который я нашел, это py-lessly .Хотя есть и другие реализации в Интернете.Мне также нравится, что код py-lessly сбрасывает на простую карту yaml, которая не требует !! omap рядом с каждым словарем - сохраняет YAML красивым!

Существует также layered-yaml-attrdict-config , который загружает данные YAML в подкласс OrderedDict с именем AttrDict с некоторыми дополнительными функциями.Мне пришлось добавить кое-что в эту реализацию, чтобы она работала для меня - я думаю, что при сбросе я потерял порядок, поэтому я добавил код из безыдейной реализации.Я также хотел работать с комбинированной структурой dict и list и должен был написать дополнительный код для рекурсивного применения AttrDict ко всей структуре данных.

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

...