Подтвердить что ты не робот

Понимание травления в Python

Недавно я получил задание, в котором мне нужно поместить словарь (где каждый ключ относится к списку) в маринованной форме. Единственная проблема в том, что я понятия не имею, что такое маринованная форма. Может ли кто-нибудь указать мне правильное направление, чтобы найти полезные ресурсы, чтобы помочь мне изучить эту концепцию?

4b9b3361

Ответ 1

В то время как другие указали на документацию Python на модуль pickle, который является отличным ресурсом, вы также можете проверить Глава 13: Сериализация объектов Python Dive Into Python 3 от Марка Пилигрима.

Ответ 2

Модуль pickle реализует фундаментальный, но мощный алгоритм для сериализации и де-сериализации структуры объекта Python.

Травление - - это процесс, в соответствии с которым иерархия объектов Python преобразуется в поток байтов, а Unpickling - - это обратная операция, посредством которой поток байтов преобразуется обратно в иерархию объектов.

Травление (и рассыпание) альтернативно известно как сериализация, сортировка или выравнивание.

import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

Для чтения из маринованного файла -

import pprint, pickle

pkl_file = open('data.pkl', 'rb')

data1 = pickle.load(pkl_file)
pprint.pprint(data1)

data2 = pickle.load(pkl_file)
pprint.pprint(data2)

pkl_file.close()

source - https://docs.python.org/2/library/pickle.html

Ответ 3

Травление - это мини-язык, который может использоваться для преобразования соответствующего состояния из объекта python в строку, где эта строка однозначно представляет объект. Затем (un) травление может использоваться для преобразования строки в живой объект, путем "восстановления" объекта из сохраненного состояния, создающего строку.

>>> import pickle
>>> 
>>> class Foo(object):
...   y = 1
...   def __init__(self, x):
...     self.x = x
...     return
...   def bar(self, y):
...     return self.x + y
...   def baz(self, y):
...     Foo.y = y  
...     return self.bar(y)
... 
>>> f = Foo(2)
>>> f.baz(3)
5
>>> f.y
3
>>> pickle.dumps(f)
"ccopy_reg\n_reconstructor\np0\n(c__main__\nFoo\np1\nc__builtin__\nobject\np2\nNtp3\nRp4\n(dp5\nS'x'\np6\nI2\nsb."

Что вы можете видеть здесь, так это то, что pickle не сохраняет исходный код для класса, но сохраняет ссылку на определение класса. В принципе, вы можете почти прочитать выбранную строку... она говорит (грубо говоря) "call copy_reg restore, где аргументы - это класс, определенный __main__.Foo, а затем делать другие вещи". Другим материалом является сохраненное состояние экземпляра. Если вы посмотрите глубже, вы можете извлечь, что для "string x" установлено значение "integer 2" (примерно: S'x'\np6\nI2). Это фактически отсеченная часть маринованной строки для словарной записи... dict f.__dict__, которая {'x': 2}. Если вы посмотрите на исходный код для pickle, он очень четко дает перевод для каждого типа объекта и операции из python в макетированный байтовый код.

Обратите также внимание на то, что существуют различные варианты языка травления. По умолчанию используется протокол 0, который является более удобочитаемым для человека. Там также протокол 2, показанный ниже (и 1,3 и 4, в зависимости от версии используемого вами питона).

>>> pickle.dumps([1,2,3])
'(lp0\nI1\naI2\naI3\na.'
>>> 
>>> pickle.dumps([1,2,3], -1)
'\x80\x02]q\x00(K\x01K\x02K\x03e.'

Опять же, это еще диалект языка травления, и вы можете видеть, что строка протокола 0 говорит "получить список, включите I1, I2, I3", в то время как протокол 2 сложнее читать, но говорит то же самое вещь. Первый бит \x80\x02 указывает, что это протокол 2 - тогда у вас есть ], который говорит ему список, а затем вы можете увидеть целые числа 1,2,3. Опять же, проверьте исходный код для pickle, чтобы увидеть точное сопоставление для языка травления.

Чтобы отменить травление до строки, используйте load/load.

>>> p = pickle.dumps([1,2,3])
>>> pickle.loads(p)
[1, 2, 3]

Ответ 4

Травление - это просто сериализация: помещение данных в форму, которая может быть сохранена в файле и получена позже. Вот документы в модуле pickle:

http://docs.python.org/release/2.7/library/pickle.html

Ответ 5

http://docs.python.org/library/pickle.html#example

import pickle

data1 = {'a': [1, 2.0, 3, 4+6j],
         'b': ('string', u'Unicode string'),
         'c': None}

selfref_list = [1, 2, 3]
selfref_list.append(selfref_list)

output = open('data.pkl', 'wb')

# Pickle dictionary using protocol 0.
pickle.dump(data1, output)

# Pickle the list using the highest protocol available.
pickle.dump(selfref_list, output, -1)

output.close()

Ответ 6

Травление в Python используется для сериализации и де-сериализации объектов Python, таких как словарь в вашем случае. Обычно я использую модуль cPickle, поскольку он может быть намного быстрее, чем модуль Pickle.

import cPickle as pickle    

def serializeObject(pythonObj):
    return pickle.dumps(pythonObj, pickle.HIGHEST_PROTOCOL)

def deSerializeObject(pickledObj):
    return pickle.loads(pickledObj)

Ответ 7

Модуль pickle реализует фундаментальный, но мощный алгоритм для сериализации и де-сериализации структуры объекта Python. "Травление" - это процесс, посредством которого иерархия объектов Python преобразуется в поток байтов, а "unpickling" - это обратная операция, посредством которой поток байтов преобразуется обратно в иерархию объектов. Однако травление (и разбрасывание) альтернативно известно как "сериализация", "маршалинг" или "сглаживание", однако, чтобы избежать путаницы, термины, используемые здесь, являются "травлением" и "рассыпанием".

Модуль рассола имеет оптимизированного кузена, называемого модулем cPickle. Как следует из его названия, cPickle записывается на C, поэтому он может быть до 1000 раз быстрее, чем рассол. Однако он не поддерживает подклассы классов Pickler() и Unpickler(), поскольку в cPickle это функции, а не классы. Большинство приложений не нуждаются в этой функции и могут извлечь выгоду из улучшения производительности cPickle. Кроме этого, интерфейсы двух модулей почти идентичны; общий интерфейс описан в этом руководстве, и при необходимости указывается разница. В следующих обсуждениях мы используем термин "рассол" для коллективного описания модулей рассола и cPickle.

Потоки данных, которые производят два модуля, гарантируются как взаимозаменяемые.

Ответ 8

Рассол> Сериализация> бинарный поток

import pickle
f = open("data.txt","wb")
dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
pickle.dump(dct,f)
f.close()

UnPickle> десериализация

import pickle
f = open("data.txt","rb")
d = pickle.load(f)
print (d)
f.close()

Травление

>>> from pickle import dump
>>> dct = {"name":"Ravi", "age":23, "Gender":"M","marks":75}
>>> dctstring = dumps(dct)
>>> dctstring
b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x04\x00\x00\x00Raviq\x02X\x03\x00\x00\x00ageq\x03K\x17X\x06\x00\x00\x00Genderq\x04X\x01\x00\x00\x00Mq\x05X\x05\x00\x00\x00marksq\x06KKu.'

Unpickling

>>> from pickle import load
>>> dct = loads(dctstring)
>>> dct
{'name': 'Ravi', 'age': 23, 'Gender': 'M', 'marks': 75}