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?
open('filename', 'wb')
Respostas:
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.load
isso, 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.load
novamente, 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
fonte
Existe uma função read_pickle como parte do pandas 0.22+
import pandas as pd object = pd.read_pickle(r'filepath')
fonte
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()
fonte
Desenvolvi uma ferramenta de software que abre (a maioria) arquivos Pickle diretamente no seu navegador (nada é transferido, então é 100% privado):
https://pickleviewer.com/
fonte
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)
fonte