Как я могу использовать рассол, чтобы сохранить дикт?
Я просмотрел информацию о том, что Python docs отдай, но я все равно немного запутался. Может ли кто-нибудь опубликовать пример кода, который напишет новый файл, а затем использовать pickle для сброса словаря в него?
9 ответов:
попробуйте это:
import pickle a = {'hello': 'world'} with open('filename.pickle', 'wb') as handle: pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL) with open('filename.pickle', 'rb') as handle: b = pickle.load(handle) print a == b
import pickle your_data = {'foo': 'bar'} # Store data (serialize) with open('filename.pickle', 'wb') as handle: pickle.dump(your_data, handle, protocol=pickle.HIGHEST_PROTOCOL) # Load data (deserialize) with open('filename.pickle', 'rb') as handle: unserialized_data = pickle.load(handle) print(your_data == unserialized_data)
преимущество
HIGHEST_PROTOCOL
это то, что файлы становятся меньше. Это делает unpickling иногда гораздо быстрее.важное замечание: максимальный размер файла рассола составляет около 2 ГБ.
альтернативный способ
import mpu your_data = {'foo': 'bar'} mpu.io.write('filename.pickle', data) unserialized_data = mpu.io.read('filename.pickle')
Альтернативные Форматы
- CSV: супер простой формат (читать и писать)
- JSON: хорошо подходит для записи удобочитаемых данных; очень часто используется (читать & пиши)
- YAML: YAML является надмножеством JSON, но легче читать (читать и писать,сравнение JSON и YAML)
- pickle: формат сериализации Python (читать и писать)
- MessagePack (пакет Python): более компактное представление (читать и писать)
- HDF5 (пакет Python): хорошо для матриц (читать и писать)
- XML: тоже существует * вздох* (читать & написать)
для вашего приложения может быть важно следующее:
- поддержка другими языками программирования
- производительность чтения / записи
- компактность (размер файла)
Читайте также: сравнение форматов сериализации данных
В случае, если вы вместо того, чтобы искать способ сделать файлы конфигурации, вы можете прочитать мою короткую статью файлы конфигурации в Python
# Save a dictionary into a pickle file. import pickle favorite_color = {"lion": "yellow", "kitty": "red"} # create a dictionary pickle.dump(favorite_color, open("save.p", "wb")) # save it into a file named save.p # ------------------------------------------------------------- # Load the dictionary back from the pickle file. import pickle favorite_color = pickle.load(open("save.p", "rb")) # favorite_color is now {"lion": "yellow", "kitty": "red"}
>>> import pickle >>> with open("/tmp/picklefile", "wb") as f: ... pickle.dump({}, f) ...
обычно предпочтительнее использовать реализацию cPickle
>>> import cPickle as pickle >>> help(pickle.dump) Help on built-in function dump in module cPickle: dump(...) dump(obj, file, protocol=0) -- Write an object in pickle format to the given file. See the Pickler docstring for the meaning of optional argument proto.
в общем, засолки
dict
не удастся, если у вас есть только простые вещи в нем, такие как строки и целые числа.Python 2.7.9 (default, Dec 11 2014, 01:21:43) [GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> from numpy import * >>> type(globals()) <type 'dict'> >>> import pickle >>> pik = pickle.dumps(globals()) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps Pickler(file, protocol).dump(obj) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump self.save(obj) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save f(self, obj) # Call unbound method with explicit self File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict self._batch_setitems(obj.iteritems()) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems save(v) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 306, in save rv = reduce(self.proto) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex raise TypeError, "can't pickle %s objects" % base.__name__ TypeError: can't pickle module objects >>>
даже a действительно простой
dict
будет часто терпеть неудачу. Это просто зависит от содержания.>>> d = {'x': lambda x:x} >>> pik = pickle.dumps(d) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps Pickler(file, protocol).dump(obj) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump self.save(obj) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save f(self, obj) # Call unbound method with explicit self File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict self._batch_setitems(obj.iteritems()) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems save(v) File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save f(self, obj) # Call unbound method with explicit self File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global (obj, module, name)) pickle.PicklingError: Can't pickle <function <lambda> at 0x102178668>: it's not found as __main__.<lambda>
однако, если вы используете лучший сериализатор, как
dill
илиcloudpickle
, то большинство словарей можно мариновать:>>> import dill >>> pik = dill.dumps(d)
или если вы хотите сохранить ваши
dict
в файл...>>> with open('save.pik', 'w') as f: ... dill.dump(globals(), f) ...
в последний пример идентичен любому из других хороших ответов, опубликованных здесь (что помимо пренебрежения возможностью выбора содержимого
dict
хорошие).
import pickle dictobj = {'Jack' : 123, 'John' : 456} filename = "/foldername/filestore" fileobj = open(filename, 'wb') pickle.dump(dictobj, fileobj) fileobj.close()
если вы просто хотите сохранить dict в одном файле, используйте
pickle
подобноеimport pickle a = {'hello': 'world'} with open('filename.pickle', 'wb') as handle: pickle.dump(a, handle) with open('filename.pickle', 'rb') as handle: b = pickle.load(handle)
если вы хотите сохранить и восстановить несколько словарей в несколько файлов для кэширование и хранение более сложных данных, используйте anycache. Он делает все остальное, что вам нужно вокруг
pickle
from anycache import anycache @anycache(cachedir='path/to/files') def myfunc(hello): return {'hello', hello}
Anycache хранит разные
myfunc
результаты в зависимости от аргументов разные файлы вcachedir
и перезагружает их.посмотреть документация для получения дополнительной информации.
простой способ сбросить данные Python (например, словарь) в файл рассола.
import pickle your_dictionary = {} pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))
Я нашел маринование запутанным (возможно, потому, что я толстый). Я обнаружил, что это работает, хотя:
myDictionaryString=str(myDictionary)
которые затем можно записать в текстовый файл. Я отказался от попыток использовать pickle, поскольку я получал ошибки, говорящие мне писать целые числа в a .файл dat. Я извиняюсь за то, что не использовал рассол.