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?

20
demandé sur Roma Karageorgievich 2016-01-28 20:22:52

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
32
répondu jsbueno 2016-01-28 17:37:57

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()
3
répondu Noctis Skytower 2016-01-28 17:38:29

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)

-7
répondu Eric MacLeod 2018-06-26 12:55:40