Вопрос по file, python, persistence – Самый простой способ сохранить структуру данных в файл в Python?

27

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

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

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

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

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

Вот еще пара: Набор данных а также Jsonpickle. zekel

Ваш Ответ

7   ответов
55

Использоватьсоленый огуре модуль.

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
R '' обозначает необработанную строку, описанную здесь: Docs.python.org / ссылки / lexical_analysis.html # строковые литералы. По сути, это означает, что обратная косая черта в строке включается как буквенная обратная косая черта, а не как экранирование символов (хотя необработанная строка не может заканчиваться обратной косой чертой). Miles
Я исправил пример - файл нужно открыть в двоичном режиме. Это все еще должно быть для Python 2, но это не так сильно. Miles
Убедитесь, что вы читаете документацию по Python (в том числе для соответствующей версии) и не полагаетесь только на примеры! :) Docs.python.org / 3,0 / библиотека / pickle.html (Извините за спам в комментариях!) Miles
Технически засечка будет работать для файлов в текстовом режиме, если вы не используете двоичный формат рассола (т. Е. Protocol = 0) и используете его последовательно (т.е. также используете текстовый режим для чтения назад). Однако лучше использовать двоичный код, особенно если вы можете перемещать данные между платформами. Brian
Я сомневаюсь, что ваш исходный пример не открылся в режиме записи. ;) Но что касается бинарного режима, в Python 2 он может работать (так как бинарный флаг практически не влияет на Linux и OS X), но непереносим и может столкнуться с проблемами в Windows, если результирующий файл содержит символ новой строки или DOS EOF символы. Miles
12

Стандартная библиотека Python - Постоянство данных. Какой из них является наиболее подходящим, зависит от ваших конкретных потребностей.

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

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

7

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

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

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

просто использовать включен в стандартную библиотеку какjson модуль интерфейс немного похож наpickle, который может обрабатывать более сложные ситуации редактируемый человеком текст для отладки, обмена и контроля версий действительный код Python хорошо зарекомендовавший себя в Интернете (если ваша программа касается какого-либо домена)
JSON не является допустимым Python. Это выглядит так, на первый взгляд, но используйте несколько bools, и вы увидите проблему (JSON использует true и false, в то время как Python использует True и False). Также: массивы JSON, (dicts) имеют только строковые ключи. Так что он не сохраняет структуру данных правильно. Jürgen A. Erhard
4

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

3

ON, используйтеrepr для сериализации объекта иeval чтобы десериализовать это.

repr(object) -> string

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

Consider ast.literal_eval () Docs.python.org / библиотека / ast.html # ast.literal_eval) как альтернатива eval (). Miles
Главное, что мне не нравится в этом решении, это то, что у вас есть объект в структуре, в котором идентичность eval (repr ()) не сохраняется, repr () будет «успешной», но затем eval () прекратит работу. Miles
@ Jason: На самом деле pickle не безопаснее eval - злонамеренный ввод может выполнить код так же легко, и здесь, по крайней мере, очевидно, что он это делает, так что я думаю, что понизить голосование это немного несправедливо. Есть и другие причины избегать eval () (например, обрабатывает только объекты с evalable repr () и молча теряет данные, если они не имеют самооценки, как указывал Майлз), но с точки зрения безопасности это не хуже, чем pickle. Brian
@ Джон. Тебе ответят на этот ответ ... где С.Лотт? mhawke
pickle, YAML, JSON и т. д. все безопаснее и работают с большим количеством типов, чем этот метод. IMO, eval () следует по возможности избегать. Jason Creighton
2

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

Похожие вопросы