Что вызывает ошибку " рассол.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]