Сериализация нескольких фреймов данных [дубликат]

Вместо словаря вы также можете использовать namedtuple из модуля коллекций, что облегчает доступ.

например:

#using dictionary
variables = {}
variables["first"] = 34
variables["second"] = 45
print variables["first"], variables["second"]

#using namedtuple
Variables = namedtuple('Variables', ['first', 'second'])
vars = Variables(34, 45)
print vars.first, vars.second
183
задан Martin Thoma 8 June 2015 в 17:40
поделиться

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
374
ответ дан Blender 21 August 2018 в 01:04
поделиться
  • 1
    Великий & amp; простой ответ. – emh 7 February 2014 в 14:05
  • 2
    В конечном итоге вы должны добавить pickle.HIGHEST_PROTOCOL – Martin Thoma 8 June 2015 в 17:33
  • 3
    @JoshGrinberg: как это редактирование даже получило одобрение – Blender 10 December 2016 в 00:58
  • 4
    @Blender: нерелевантно и бесполезно сложно для этого уровня вопроса - средний пользователь будет в порядке с настройками по умолчанию. – houbysoft 25 December 2016 в 03:52
  • 5
    @houbysoft: True для пользователей Python 3, но на Python 2 использование протокола по умолчанию (0) не только невероятно неэффективно во времени и пространстве, но и не может справиться со многими вещами, которые протокол 2+ отлично обрабатывает (например, новый классы стиля, которые используют __slots__). Я не говорю, что вы всегда должны использовать HIGHEST_PROTOCOL, но гарантировать, что вы не используете протокол 0 или 1, на самом деле весьма важен. – ShadowRanger 23 August 2017 в 18:54

Если вы просто хотите сохранить 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 и перезагружает их.

Для получения дополнительной информации см. документацию .

2
ответ дан c0fec0de 21 August 2018 в 01:04
поделиться
>>> 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.
7
ответ дан John La Rooy 21 August 2018 в 01:04
поделиться
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 ГБ.

Альтернативный способ

import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')

Альтернативные форматы

Для вашего приложения может быть важно следующее:

  • Поддержка другими языками программирования
  • Производительность чтения / записи
  • Компактность (размер файла)

См. Также: Сравнение форматов сериализации данных

Если вы скорее ищете способ создания файлов конфигурации, вы можете прочитать мою короткую статью Конфигурационные файлы в Python

46
ответ дан Martin Thoma 21 August 2018 в 01:04
поделиться

В общем случае травление 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'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 хорошее).

7
ответ дан Mike McKerns 21 August 2018 в 01:04
поделиться
# 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"}
18
ответ дан nietaki 21 August 2018 в 01:04
поделиться
  • 1
    необходимо ли использовать close () после open ()? – Anna Vopureta 30 April 2018 в 00:42
  • 2
    Да, в общем. Однако в CPython (по умолчанию у вас есть python) файл автоматически закрывается всякий раз, когда истекает срок действия файлового объекта (когда на него ничего не ссылается). В этом случае, поскольку ничто не ссылается на файл-объект после его возврата функцией open (), он будет закрыт, как только загрузится. Это не считается хорошей практикой и вызовет проблемы в других системах – Ankur S 29 June 2018 в 13:17
import pickle

dictobj = {'Jack' : 123, 'John' : 456}

filename = "/foldername/filestore"

fileobj = open(filename, 'wb')

pickle.dump(dictobj, fileobj)

fileobj.close()
2
ответ дан Nunser 21 August 2018 в 01:04
поделиться

Я нашел пудинг путаницы (возможно, потому, что я толстый). Я обнаружил, что это работает, хотя:

myDictionaryString=str(myDictionary)

Что вы можете затем записать в текстовый файл. Я сдался, пытаясь использовать рассол, поскольку у меня возникали ошибки, говорящие мне написать целые числа в файл .dat. Я прошу прощения за то, что я не использовал рассол.

-5
ответ дан Pedro Rhian 21 August 2018 в 01:04
поделиться

Простой способ сбрасывать словарь в файл pickle.

import pickle

your_dictionary = {}

pickle.dump (ваш_dictionary, open (' pickle_file_name.p ',' wb '))

0
ответ дан Prashanth Muthurajaiah 21 August 2018 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: