Хранение словарей Python
Я привык приносить данные В и из использования Python .csv файлы, но есть очевидные проблемы для этого. Любые советы по простым способам хранения словаря (или наборов словарей) в файле json или pck? Например:
data = {}
data ['key1'] = "keyinfo"
data ['key2'] = "keyinfo2"
Я хотел бы знать, как сохранить и как потом загрузить его обратно.
8 ответов:
огурец сохранить:
try: import cPickle as pickle except ImportError: # python 3.x import pickle with open('data.p', 'wb') as fp: pickle.dump(data, fp, protocol=pickle.HIGHEST_PROTOCOL)
посмотреть документация модуля рассола для получения дополнительной информации о
минимальный пример, запись непосредственно в файл:
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)
Также см. ускоренный пакет ujson. https://pypi.python.org/pypi/ujson
import ujson with open('data.json', 'wb') as fp: ujson.dump(data, fp)
для записи в файл:
import json myfile.write(json.dumps(mydict))
читать из файла:
import json mydict = json.loads(myfile.read())
myfile
- это объект file для файла, в котором вы сохранили dict.
Если вы после сериализации, но не будете нуждаться в данных в других программах, я настоятельно рекомендую
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()
если вы хотите альтернативу
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
вероятно лучший выбор для мариновать после этого , аdill
может сериализовать все что угодно питон.klepto
также можете использоватьdill
.вы можете узнать
dill
здесь:https://github.com/uqfoundation/dillдополнительные mumbo-jumbo на первых нескольких строках, потому что
klepto
можно настроить для хранения словарей в файле, в контексте каталога или в базе данных SQL. API одинаковый для всего, что вы выбираете в качестве бэкэнд-архива. Это дает вам" архивируемый " словарь, с которым вы можете использоватьload
иdump
взаимодействовать с архивом.
это старая тема, но для полноты мы должны включить ConfigParser и configparser, которые являются частью стандартной библиотеки в Python 2 и 3, соответственно. Этот модуль считывает и записывает в файл config/ini и (по крайней мере, в Python 3) ведет себя во многом как словарь. Он имеет дополнительное преимущество, что вы можете хранить несколько словарей в отдельных разделах вашего файла config/ini и вызывать их. Мило!
Python 2.7.икс образец.
import ConfigParser config = ConfigParser.ConfigParser() dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'} dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'} dict3 = {'x':1, 'y':2, 'z':3} # make each dictionary a separate section in config config.add_section('dict1') for key in dict1.keys(): config.set('dict1', key, dict1[key]) config.add_section('dict2') for key in dict2.keys(): config.set('dict2', key, dict2[key]) config.add_section('dict3') for key in dict3.keys(): config.set('dict3', key, dict3[key]) # save config to file f = open('config.ini', 'w') config.write(f) f.close() # read config from file config2 = ConfigParser.ConfigParser() config2.read('config.ini') dictA = {} for item in config2.items('dict1'): dictA[item[0]] = item[1] dictB = {} for item in config2.items('dict2'): dictB[item[0]] = item[1] dictC = {} for item in config2.items('dict3'): dictC[item[0]] = item[1] print(dictA) print(dictB) print(dictC)
Python 3.Х пример.
import configparser config = configparser.ConfigParser() dict1 = {'key1':'keyinfo', 'key2':'keyinfo2'} dict2 = {'k1':'hot', 'k2':'cross', 'k3':'buns'} dict3 = {'x':1, 'y':2, 'z':3} # make each dictionary a separate section in config config['dict1'] = dict1 config['dict2'] = dict2 config['dict3'] = dict3 # save config to file f = open('config.ini', 'w') config.write(f) f.close() # read config from file config2 = configparser.ConfigParser() config2.read('config.ini') # ConfigParser objects are a lot like dictionaries, but if you really # want a dictionary you can ask it to convert a section to a dictionary dictA = dict(config2['dict1'] ) dictB = dict(config2['dict2'] ) dictC = dict(config2['dict3']) print(dictA) print(dictB) print(dictC)
вывод на консоль
{'key2': 'keyinfo2', 'key1': 'keyinfo'} {'k1': 'hot', 'k2': 'cross', 'k3': 'buns'} {'z': '3', 'y': '2', 'x': '1'}
содержимое конфига.ini
[dict1] key2 = keyinfo2 key1 = keyinfo [dict2] k1 = hot k2 = cross k3 = buns [dict3] z = 3 y = 2 x = 1