Как загрузить файл выбора, содержащий словарь с символами Юникода? - PullRequest
8 голосов
/ 19 марта 2012

У меня есть словарь:

mydict={'öö':1,'ää':2}

Я записал это в файл рассола:

a=codecs.open(r'mydict.pkl', 'wb', 'utf-8')
pickle.dump(mydict, a)

Если я попытаюсь загрузить его:

m=codecs.open(r'mydict.pkl', 'rb', 'utf-8')
mydict = pickle.load(m)

Я получаю ошибку:

KeyError: u"S'\\xe4\\xe4'\np1\nI2\nsS'\\xf6\\xf6'\np2\nI1\ns."

Есть идеи, как это решить? Помощь очень ценится.

Ответы [ 3 ]

8 голосов
/ 19 марта 2012

pickle - это двоичный формат, использующий переводы кодеков перед тем, как запись сломает его.Попробуйте просто записать в файл и загрузить его обратно:

>>> mydict={'öö':1,'ää':2}
>>> mydict
{'\xc3\xb6\xc3\xb6': 1, '\xc3\xa4\xc3\xa4': 2}
>>> pickle.dump(mydict, open('/tmp/test.pkl', 'wb'))
>>> pickle.load(open('/tmp/test.pkl', 'rb'))
{'\xc3\xb6\xc3\xb6': 1, '\xc3\xa4\xc3\xa4': 2}

Но, скорее всего, вы хотите использовать Unicode в первую очередь:

>>> mydict={u'öö':1,u'ää':2}
3 голосов
/ 19 марта 2012

Я считаю, что проблема заключается в использовании codecs.open.Pickles - это двоичные файлы, а не текст, и codec предназначен для прозрачного преобразования некоторых кодировок текста в Unicode.Вы должны просто использовать open.

0 голосов
/ 14 октября 2014

Старая проблема, но ... У меня была та же проблема, и я не думал, что дополнительный дисковый ввод-вывод - хорошее решение. Я предлагаю вам использовать base64 кодирование / декодирование.

import base64

serialized_str = base64.b64encode(pickle.dumps(mydict))
my_obj_back = pickle.loads(base64.b64decode(serialized_str))

Даже cPickle можно использовать одинаково для более быстрого получения пакетов.

...