Como ler o arquivo pickle?

91

Eu criei alguns dados e os armazenei várias vezes assim:

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

Cada vez que o tamanho do arquivo aumenta, mas quando eu abro o arquivo

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

Eu posso ver apenas os dados da última vez. Como posso ler o arquivo corretamente?

Kenenbek Arzymatov
fonte
1
Você está anexando objetos ao seu arquivo. Quando você remove a marca, você remove apenas a primeira entrada. Tem certeza de que precisa de todas essas entradas? Se não - mude paraopen('filename', 'wb')
Andrey
Sim, preciso de todas as entradas. O tamanho dos arquivos mostra que ele contém tudo.
Kenenbek Arzymatov
1
Então @jsbueno está certo em sua resposta.
Andrey
Eu construí algo para visualizar os arquivos de pickle diretamente no seu navegador: pickleviewer.com
Christo S. Christov

Respostas:

98

Pickle serializa um único objeto por vez e lê de volta um único objeto - os dados conservados são gravados em sequência no arquivo.

Se você simplesmente fizer pickle.loadisso, deverá ler o primeiro objeto serializado no arquivo (não o último como você escreveu).

Depois de desserializar o primeiro objeto, o ponteiro do arquivo está no início do próximo objeto - se você simplesmente chamar pickle.loadnovamente, ele lerá o próximo objeto - faça isso até o final do arquivo.

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

Existe uma função read_pickle como parte do pandas 0.22+

import pandas as pd

object = pd.read_pickle(r'filepath')
Taylrl
fonte
6

A seguir está um exemplo de como você pode escrever e ler um arquivo pickle. Observe que se você continuar anexando dados de pickle ao arquivo, precisará continuar lendo o arquivo até encontrar o que deseja ou uma exceção será gerada ao chegar ao final do arquivo. Isso é o que a última função faz.

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()
Noctis Skytower
fonte
6

Desenvolvi uma ferramenta de software que abre (a maioria) arquivos Pickle diretamente no seu navegador (nada é transferido, então é 100% privado):

https://pickleviewer.com/

Christo S. Christov
fonte
-27

Você não está fazendo nada com ele, apenas carregando o arquivo.

for line in x:
    print x

irá imprimir cada linha. (No segundo com a declaração)

Eric MacLeod
fonte