Что вызывает ошибку " рассол.UnpicklingError: неверный ключ загрузки,' '."?
Я пытаюсь сохранить 5000 элементов данных в массиве. Эти 5000 элементов являются хранилищем в существующем файле (поэтому он не пуст).
но я получаю ошибку, и я не знаю, что ее вызывает.
IN:
def array():
name = 'puntos.df4'
m = open(name, 'rb')
v = []*5000
m.seek(-5000, io.SEEK_END)
fp = m.tell()
sz = os.path.getsize(name)
while fp < sz:
pt = pickle.load(m)
v.append(pt)
m.close()
return v
OUT:
line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
3 ответов
маринование является рекурсивным, а не последовательного. Таким образом, чтобы замариновать список,pickle
начнет мариновать содержащий список, затем мариновать первый элемент ... погружение в первый элемент и маринование зависимостей и подэлементов до тех пор, пока первый элемент не будет сериализован. Затем переходит к следующему элементу списка и так далее, пока не завершит список и не завершит сериализацию заключительного списка. Короче говоря, трудно рассматривать рекурсивный рассол как последовательный, за исключением некоторых специальных случаи. Лучше использовать более умный шаблон на вашем dump
, Если вы хотите load
особым образом.
самый распространенный рассол, это мариновать все с помощью одного dump
файл -- но тогда вы должны load
все сразу в один load
. Однако, если вы открываете дескриптор файла и делаете несколько dump
вызовы (например, по одному для каждого элемента списка или кортежа выбранных элементов), затем ваш load
будет отражать, что... вы открываете дескриптор файла и делаете несколько load
вызовы, пока у вас нет всех элементов списка и вы можете восстановить список. Это все еще не легко выборочно load
однако только некоторые элементы списка. Для этого вам, вероятно, придется хранить элементы списка как dict
(с индексом элемента или блока в качестве ключа) с помощью пакета типа klepto
, который может разбить замаринованный dict
в несколько файлов прозрачно, и включает легкую загрузку специфических элементов.
Я не совсем уверен, что вы пытаетесь достичь, ища определенное смещение и пытаясь загрузить отдельные значения вручную, типичное использование pickle
модуль:
# save data to a file
with open('myfile.pickle','wb') as fout:
pickle.dump([1,2,3],fout)
# read data from a file
with open('myfile.pickle') as fin:
print pickle.load(fin)
# output
>> [1, 2, 3]
Если вы сбросили список, вы загрузите список, нет необходимости загружать каждый элемент по отдельности.
вы говорите, что у вас есть ошибка, прежде чем вы искали смещение -5000, возможно, файл, который вы пытаетесь прочитать, поврежден.
Если у вас есть доступ к исходные данные, я предлагаю вам попробовать сохранить его в новый файл и прочитать его, как в Примере.
это может не иметь отношения к вашей конкретной проблеме, но у меня была аналогичная проблема, когда архив рассола был создан с помощью gzip
.
например, если сжатый архив рассола сделан так,
import gzip, pickle
with gzip.open('test.pklz', 'wb') as ofp:
pickle.dump([1,2,3], ofp)
попытка открыть его бросает ошибки
with open('test.pklz', 'rb') as ifp:
print(pickle.load(ifp))
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
_pickle.UnpicklingError: invalid load key, ''.
но, если файл pickle открыт с помощью gzip
все гармонично
with gzip.open('test.pklz', 'rb') as ifp:
print(pickle.load(ifp))
[1, 2, 3]