Как читать файл рассола?


91

Я создал некоторые данные и несколько раз сохранил их следующим образом:

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

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

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

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


1
Вы добавляете объекты в свой файл. Когда вы распаковываете, вы снимаете только первую запись. Вы уверены, что вам нужны все эти записи? Если нет - смени наopen('filename', 'wb')
Андрей

Да, мне нужны все записи. Размер файлов показывает, что он содержит все.
Кененбек Арзыматов

1
Тогда @jsbueno прав в своем ответе.
Андрей


Я создал кое-что для просмотра файлов рассола прямо в вашем браузере: pickleviewer.com
Christo S. Christov

Ответы:


98

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

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

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

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


6

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

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()

6

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

https://pickleviewer.com/


-27

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

for line in x:
    print x

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.