2015-04-10 3 views
0

Мне предоставлен файл, содержащий два маринованных объекта - он был отправлен мне как .pk-файл. Мне сказали, что у него есть два объекта, однако моя попытка отключить эти файлы не увенчалась успехом.Значение Ошибка при распаковке файла

Первый маринованный объект содержит словарь пар чисел с их римскими цифрами, а второй содержит словарные пары римских цифр с их номерами. Как можно разделить эти два словаря отдельно?

Это то, что я ниже, наряду с сообщением об ошибке я получаю:

import pickle 
x,y=pickle.load(open("C://Users//Documents//roman.pk", "rb")) 
print(x,y) 

Сообщение об ошибке:

ValueError: too many values to unpack (expected 2) 
+0

Что произойдет, если вы просто «pickle.load» для одного объекта, а затем посмотрите, что он содержит? Один из словарей? Что-то другое? Вы также можете попробовать дважды вызвать pickle.load в одном файле (т. Е. «Открыть» его один раз, а затем дважды «загрузить»). См. Http://stackoverflow.com/q/20716812/3001761 – jonrsharpe

+0

Если я запускаю его только с одной переменной, то он дает мне один из словарей. Если я попытаюсь загрузить его дважды, он просто дает мне первый словарь дважды. – Megan

+0

Вы используете 'load (open (...))' оба раза? Если это так, это приведет к сбросу указателя на начало файла. Вам нужно ** открыть его один раз ** (с помощью диспетчера контекста 'with', в идеале - см. Http://stackoverflow.com/a/3287367/3001761). – jonrsharpe

ответ

3

pickle.load загрузит только первый консервированный объект, который находит в файл. В вашем случае это словарь с более чем двумя ключами, поэтому x, y = pickle.load(...) терпит неудачу, потому что он пытается распаковать ключи словаря на идентификаторы x и y.

Вместо этого, вы должны open файл один раз, и load из него дважды:

with open("...roman.pk") as file_: 
    first_dict = pickle.load(file_) # file pointer is now at end of first object 
    second_dict = pickle.load(file_) # read in second object 

С другой стороны, поощрять тот, кто поставляет вам файл, чтобы поместить два словаря в один объект, например, кортеж (first_dict, second_dict) и pickle этот единственный объект; это намного проще, чем полагаться на то, как точно известно, сколько масличных объектов находится в файле.

-1

pickle.load должен загружать структуру данных в один параметр. , если у вас есть 2 словаря в roman.pk, это зависит от того, как сгруппировали 2 словаря

например (dict1, dict2)

В этом случае: Вы, наверное, хотите попробовать: (х, у) = pickle.load (open («C: //Users//Documents//roman.pk», «rb»)) print len ​​(x) print len ​​(y) Проверить правильность загрузки

+0

'(x, y) = ...' точно так же, как 'x, y = ...' и не будет работать по той же причине – jonrsharpe

Смежные вопросы