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

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

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

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

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

Kenenbek Arzymatov

Ответов: 4

Ответы (4)

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

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

After unserializing the first object, the file-pointer is at the beggining of the next object - if you simply call pickle.load again, it will read that next object - do that until the end of the file.

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

Я разработал программный инструмент, который открывает (большинство) файлов Pickle прямо в вашем браузере (ничего не передается, поэтому он на 100% конфиденциальный):

https://pickleviewer.com/ (ранее)

Теперь он размещен здесь: https://fire-6dcaa-273213.web.app/

Изменить: доступно здесь, если вы хотите разместить его где-нибудь: https://github.com/ch-hristov/Pickle-viewer

Не стесняйтесь разместить это где-нибудь.

Существует функция read_pickle как часть pandas 0.22 +

import pandas as pd

object = pd.read_pickle(r'filepath')

Ниже приводится пример того, как вы можете писать и читать файл 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()

2022 WebDevInsider