Подтвердить что ты не робот

Как читать файл pickle?

Я создал некоторые данные и несколько раз сохранил их:

with open('filename', 'a') as f:
        pickle.dump(data, f)

Каждый раз, когда размер файла увеличивается, но когда я открываю файл

with open('filename', 'rb') as f:
    x = pickle.load(f)

Я смотрю только данные из последнего времени. Как я могу правильно прочитать файл?

4b9b3361

Ответ 1

Pickle сериализует один объект за раз и считывает один объект - маринованные данные записываются последовательно в файл.

Если вы просто выполните pickle.load, вы должны прочитать первый объект, сериализованный в файл (не последний, как вы уже написали).

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

objects = []
with (open("myfile", "rb")) as openfile:
    while True:
        try:
            objects.append(pickle.load(openfile))
        except EOFError:
            break

Ответ 2

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

import os
import pickle


PICKLE_FILE = 'pickle.dat'


def main():
    # append data to the pickle file
    add_to_pickle(PICKLE_FILE, 123)
    add_to_pickle(PICKLE_FILE, 'Hello')
    add_to_pickle(PICKLE_FILE, None)
    add_to_pickle(PICKLE_FILE, b'World')
    add_to_pickle(PICKLE_FILE, 456.789)
    # load & show all stored objects
    for item in read_from_pickle(PICKLE_FILE):
        print(repr(item))
    os.remove(PICKLE_FILE)


def add_to_pickle(path, item):
    with open(path, 'ab') as file:
        pickle.dump(item, file, pickle.HIGHEST_PROTOCOL)


def read_from_pickle(path):
    with open(path, 'rb') as file:
        try:
            while True:
                yield pickle.load(file)
        except EOFError:
            pass


if __name__ == '__main__':
    main()

Ответ 3

вы не делаете ничего с собой, только загружая файл.

for line in x:
    print x

напечатает каждую строку. (Во втором с утверждением)