Подходит ли что-то вроде ConfigParser для сохранения состояния (ключ, значение) между запусками? - PullRequest
2 голосов
/ 27 мая 2009

Я хочу сохранить набор пар ключ-значение (string, int) между запусками программы Python, перезагрузить их при последующих запусках и записать изменения, которые будут доступны при следующем запуске.

Я не считаю эти данные файлом конфигурации, но он вполне соответствовал бы возможностям ConfigParser. Мне нужно только два [разделы]. Это всего несколько сотен пар и очень просто, так что я не думаю, что нужно создавать реальную базу данных.

Уместно ли использовать ConfigParser таким образом? Я также рассмотрел использование Perl и XML :: Simple. Что об этом? Есть ли способ сделать это в bash без Python или Perl?

Ответы [ 6 ]

16 голосов
/ 27 мая 2009

Ну, у вас есть лучшие варианты. Например, вы можете использовать формат pickle или json . Модуль сериализации Pickle очень прост в использовании.

import cPickle
cPickle.dump(obj, open('save.p', 'wb')) 
obj = cPickle.load(open('save.p', 'rb'))

Формат не предназначен для чтения человеком, а расслоение не защищено от ошибочных или вредоносных данных. Вы не должны распаковывать ненадежные данные.

Если вы используете python 2.6, есть встроенный модуль с именем json . Это так же просто, как мариновать в использовании:

import json
encoded = json.dumps(obj)
obj = json.loads(encoded)

Формат Json удобен для чтения и очень похож на строковое представление словаря в python. И не имеет никаких проблем с безопасностью, как рассол.

Если вы используете более раннюю версию python, вы можете вместо этого simplejson .

8 голосов
/ 27 мая 2009

Для меня PyYAML хорошо работает для такого рода вещей. Раньше я использовал pickle или ConfigParser.

2 голосов
/ 27 мая 2009

Звучит как работа для дБм . По сути, это хэш, который живет за пределами вашей программы. Есть много реализаций. В Perl тривиально связать dbm с хешем (т.е. сделать так, чтобы dbm действительно являлась нормальной хеш-переменной). Я не знаю, есть ли какой-нибудь эквивалент в механизме в Python, но я был бы удивлен, если бы не было.

2 голосов
/ 27 мая 2009

ConfigParser - прекрасный способ сделать это. Есть и другие способы (упомянутые модули json и cPickle могут быть полезны), которые также хороши, в зависимости от того, хотите ли вы иметь текстовые или двоичные файлы и хотите, чтобы код работал просто в старых версиях Python или нет.

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

0 голосов
/ 28 мая 2009

Если вы можете обновить ключ состояния ключом, то любая из баз данных DBM будет работать. Если вам нужна действительно высокая производительность и компактное хранение, то Tokyo Cabinet - http://tokyocabinet.sourceforge.net/ - классная игрушка.

Если вы хотите сохранить и загрузить все сразу (возможно, чтобы сохранить старые версии или что-то подобное) и не иметь слишком много данных, просто используйте JSON. С ним гораздо приятнее работать, чем с XML. Я не знаю, как реализация JSON в Python, но в Perl модуль JSON :: XS безумно быстр.

0 голосов
/ 27 мая 2009

Повторяя это в bash: если ваши строки являются действительными идентификаторами, вы можете использовать переменные окружения и env.

...