Pickle - размещение более одного объекта в файле? - программирование
Подтвердить что ты не робот

Pickle - размещение более одного объекта в файле?

У меня есть метод, который сбрасывает в файл несколько маринованных объектов (кортежей).

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

myob = cpickle.load(g1.readlines()[2])

где g1 - это файл, я получаю ошибку EOF, потому что мой маринованный объект длиннее одной строки. Есть ли способ получить только мой маринованный объект?

4b9b3361

Ответ 1

Если вы передаете дескриптор файла непосредственно в рассол, вы можете получить нужный результат.

import pickle

# write a file
f = open("example", "w")
pickle.dump(["hello", "world"], f)
pickle.dump([2, 3], f)
f.close()

f = open("example", "r")
value1 = pickle.load(f)
value2 = pickle.load(f)
f.close()

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

pickle.load будет достаточно читать только из файла, чтобы получить первое значение, оставив дескриптор файла открытым и указывая на начало следующего объекта в файле. Затем второй вызов будет читать второй объект и оставить указатель файла в конце файла. Третий вызов завершится неудачно с EOFError, как вы ожидали.

Хотя я использовал простой старый pickle в моем примере, этот метод работает точно так же с cPickle.

Ответ 2

Я думаю, что лучший способ - упаковать ваши данные в один объект, прежде чем хранить его, и распаковать его после его загрузки. Вот пример использования кортеж в качестве контейнера (you can use dict also):

a = [1,2]
b = [3,4]

with open("tmp.pickle", "wb") as f:
    pickle.dump((a,b), f)

with open("tmp.pickle", "rb") as f:
    a,b = pickle.load(f) 

Ответ 3

Не пытайтесь читать их как строки файла, просто pickle.load() количество объектов, которые вы хотите. См. Мой ответ на вопрос Как сохранить объект в Python для примера этого.