Хранение словарей 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 для взаимодействия с архивом.