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

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
jsbueno
источник
27

В pandas 0.22+ есть функция read_pickle

import pandas as pd

object = pd.read_pickle(r'filepath')
Тайлрл
источник
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

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

Эрик МакЛауд
источник