Хранение словарей Python
Я использую для ввода данных в Python и из них с использованием CSV файлов, но есть очевидные проблемы. Любые советы по простым способам хранения словаря (или наборов словарей) в файле json или pck? Например:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Я хотел бы знать, как сохранить это, а затем как загрузить его обратно.
Ответы
Ответ 1
Pickle сохранить:
import cPickle as pickle
with open('data.p', 'wb') as fp:
pickle.dump(data, fp)
Pickle load:
with open('data.p', 'rb') as fp:
data = pickle.load(fp)
JSON сохранить:
import json
with open('data.json', 'w') as fp:
json.dump(data, fp)
Поставьте дополнительные аргументы, например sort_keys
или indent
, чтобы получить хороший результат. Аргумент sort_keys будет сортировать ключи по алфавиту, а отступ будет отступать от вашей структуры данных с пробелами indent=N
.
json.dump(data, fp, sort_keys=True, indent=4)
JSON load:
with open('data.json', 'r') as fp:
data = json.load(fp)
Ответ 2
Минимальный пример: запись непосредственно в файл:
import json
json.dump(data, open(filename, 'wb'))
data = json.load(open(filename))
или безопасное открытие/закрытие:
import json
with open(filename, 'wb') as outfile:
json.dump(data, outfile)
with open(filename) as infile:
data = json.load(infile)
Если вы хотите сохранить его в строке вместо файла:
import json
json_str = json.dumps(data)
data = json.loads(json_str)
Ответ 3
Если вы после сериализации, но не нуждаетесь в данных в других программах, я настоятельно рекомендую модуль shelve
. Подумайте об этом как о постоянном словаре.
myData = shelve.open('/path/to/file')
# check for values.
keyVar in myData
# set values
myData[anotherKey] = someValue
# save the data for future use.
myData.close()
Ответ 4
Также см. ускоренный пакет ujson.
https://pypi.python.org/pypi/ujson
import ujson
with open('data.json', 'wb') as fp:
ujson.dump(data, fp)
Ответ 5
Для записи в файл:
import json
myfile.write(json.dumps(mydict))
Для чтения из файла:
import json
mydict = json.loads(myfile.read())
myfile
является файловым объектом для файла, в который вы храните файл dict.
Ответ 6
Если вам нужна альтернатива pickle
или json
, вы можете использовать klepto
.
>>> init = {'y': 2, 'x': 1, 'z': 3}
>>> import klepto
>>> cache = klepto.archives.file_archive('memo', init, serialized=False)
>>> cache
{'y': 2, 'x': 1, 'z': 3}
>>>
>>> # dump dictionary to the file 'memo.py'
>>> cache.dump()
>>>
>>> # import from 'memo.py'
>>> from memo import memo
>>> print memo
{'y': 2, 'x': 1, 'z': 3}
С klepto
, если вы использовали serialized=True
, словарь был бы записан на memo.pkl
в качестве маринованного словаря вместо чистого текста.
Вы можете получить klepto
здесь: https://github.com/uqfoundation/klepto
dill
, вероятно, лучший выбор для травления, тогда pickle
сам, так как dill
может сериализовать почти что угодно в python. klepto
также может использовать dill
.
Вы можете получить dill
здесь: https://github.com/uqfoundation/dill
Дополнительный mumbo-jumbo в первых нескольких строках состоит в том, что klepto
можно настроить для хранения словарей в файле, в контексте каталога или в базе данных SQL. API тот же, что вы выбираете в качестве архива. Он дает вам "архивируемый" словарь, с помощью которого вы можете использовать load
и dump
для взаимодействия с архивом.