Самый простой способ сохранить структуру данных в файл в Python? - PullRequest
29 голосов
/ 26 июня 2009

Допустим, у меня есть что-то вроде этого:

d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }

Какой самый простой способ программно вставить это в файл, который я могу загрузить из python позже?

Могу ли я как-то сохранить его как исходный код Python (из сценария Python, а не вручную!), Затем import позже?

Или я должен использовать JSON или что-то еще?

Ответы [ 7 ]

58 голосов
/ 26 июня 2009

Используйте модуль pickle .

import pickle
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }
afile = open(r'C:\d.pkl', 'wb')
pickle.dump(d, afile)
afile.close()

#reload object from file
file2 = open(r'C:\d.pkl', 'rb')
new_d = pickle.load(file2)
file2.close()

#print dictionary object loaded from file
print new_d
12 голосов
/ 26 июня 2009

Выберите: Стандартная библиотека Python - устойчивость данных . Какой из них наиболее подходит, может варьироваться в зависимости от ваших конкретных потребностей.

pickle, вероятно, является самым простым и наиболее способным в отношении «записи произвольного объекта в файл и его восстановления» - он может автоматически обрабатывать пользовательские классы и циклические ссылки.

Для лучшей производительности травления (скорость и пространство) используйте cPickle при HIGHEST_PROTOCOL.

7 голосов
/ 26 июня 2009

Попробуйте модуль полки, который даст вам постоянный словарь, например:

import shelve
d = { "abc" : [1, 2, 3], "qwerty" : [4,5,6] }

shelf = shelve.open('shelf_file')
for key in d:
    shelf[key] = d[key]

shelf.close()

....

# reopen the shelf
shelf = shelve.open('shelf_file')
print(shelf) # => {'qwerty': [4, 5, 6], 'abc': [1, 2, 3]}
4 голосов
/ 26 июня 2009

Вы также можете взглянуть на База данных объектов Zope чем сложнее вы становитесь :-) Возможно, излишне для того, что у вас есть, но оно хорошо масштабируется и не слишком сложно в использовании.

4 голосов
/ 26 июня 2009

JSON имеет ошибки, но когда это соответствует вашим потребностям, это также:

  • простой в использовании
  • включен в стандартную библиотеку как модуль json
  • интерфейс чем-то похож на pickle, который может обрабатывать более сложные ситуации
  • редактируемый человеком текст для отладки, обмена и контроля версий
  • действительный код Python
  • хорошо зарекомендовавший себя в Интернете (если ваша программа затрагивает какой-либо из этих доменов)
3 голосов
/ 26 июня 2009

Если вы хотите сохранить его в удобном для чтения JSON-подобном формате, используйте repr для сериализации объекта и eval для его десериализации.

repr(object) -> string

Возвращает каноническое строковое представление объекта. Для большинства типов объектов eval(repr(object)) == object.

2 голосов
/ 26 июня 2009

Просто чтобы добавить к предыдущим предложениям, если вы хотите, чтобы формат файла был легко читаемым и изменяемым, вы также можете использовать YAML . Он очень хорошо работает для вложенных диктовок и списков, но масштабируется и для более сложных структур данных (т. Е. С пользовательскими объектами), и его большой плюс в том, что формат читабелен.

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