Я просмотрел информацию, которую дают документы Python, но я все еще немного смущен. Может ли кто-нибудь отправить образец кода, который будет писать новый файл, а затем использовать pickle для дампа в него словаря?
Как я могу использовать pickle для сохранения dict?
Ответ 1
Попробуйте следующее:
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
Ответ 2
Поскольку Blender, похоже, не хочет добавлять HIGHEST_PROTOCOL
к своему ответу, вот один из них:
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
заключается в том, что файлы становятся меньше. Это делает рассыпание иногда намного быстрее.
Важное примечание. Максимальный размер файла для рассола составляет около 2 ГБ.
Альтернативы
- CSV: супер простой формат (чтение и запись)
- JSON: Приятно писать человекочитаемые данные; ОЧЕНЬ широко используется (читать и писать)
- YAML: YAML является надмножеством JSON, но легче читать (читать и писать, сравнение JSON и YAML)
- pickle: формат сериализации Python (чтение и запись)
- MessagePack (Пакет Python): более компактное представление (читать и писать)
- HDF5 (Пакет Python): Nice для матриц (читать и писать)
- XML: существует слишком * sigh * (читать и написать)
Для вашего приложения может быть важно следующее:
- Поддержка другими языками программирования
- Производительность чтения/записи
- Компактность (размер файла)
См. также: Сравнение форматов сериализации данных
Если вы скорее ищете способ создания файлов конфигурации, вы можете прочитать мою короткую статью Конфигурационные файлы в Python
Ответ 3
# 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"}
Ответ 4
>>> 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.
Ответ 5
В общем, травление 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
>>>
Даже простой действительно простой 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 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
, хороши).
Ответ 6
import pickle
dictobj = {'Jack' : 123, 'John' : 456}
filename = "/foldername/filestore"
fileobj = open(filename, 'wb')
pickle.dump(dictobj, fileobj)
fileobj.close()
Ответ 7
Если вы просто хотите сохранить 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
и перезагружает их.
Подробнее см. .
Ответ 8
Я нашел пудинг путаницы (возможно, потому, что я толстый). Я обнаружил, что это работает, хотя:
myDictionaryString=str(myDictionary)
Что вы можете записать в текстовый файл. Я сдался, пытаясь использовать рассол, поскольку у меня возникали ошибки, говорящие мне написать целые числа в файл .dat. Приношу свои извинения за то, что я не использовал рассол.