Comment lire le dossier pickle?
j'ai créé quelques données et stockées à plusieurs reprises comme ceci:
with open('filename', 'a') as f:
pickle.dump(data, f)
chaque fois que la taille du fichier a augmenté, mais quand j'ouvre le fichier
with open('filename', 'rb') as f:
x = pickle.load(f)
Je ne vois que les données de la dernière fois. Comment puis-je lire correctement le fichier?
3 réponses
Pickle sérialise un seul objet à la fois, et lit en arrière un seul objet - les données sont enregistrées en séquence sur le fichier.
Si vous n'avez tout simplement pickle.load
vous devriez lire le premier objet sérialisé dans le fichier (pas la dernière que vous avez écrit).
Après désérialisation le premier objet, le pointeur de fichier est au début
de l'objet suivant - si vous appelez simplement pickle.load
encore une fois, il va lire le prochain objet - faire que jusqu'à la fin de la fichier.
objects = []
with (open("myfile", "rb")) as openfile:
while True:
try:
objects.append(pickle.load(openfile))
except EOFError:
break
ce qui suit est un exemple de la façon dont vous pouvez écrire et lire un fichier pickle. Notez que si vous continuez à ajouter des données de pickle au fichier, vous aurez besoin de continuer à lire à partir du fichier jusqu'à ce que vous trouvez ce que vous voulez ou une exception est générée en atteignant la fin du fichier. Qu'est ce que la dernière fonction.
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()
Tu ne fais rien avec elle, vous êtes seulement de charger le fichier.
for line in x:
print x
affiche chaque ligne. (Dans la seconde avec la déclaration)