Hoe een augurkbestand lezen?

Ik heb wat gegevens gemaakt en deze meerdere keren als volgt opgeslagen:

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

Elke keer dat de bestandsgrootte toenam, maar wanneer ik het bestand open

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

Ik kan alleen gegevens van de laatste keer zien.
Hoe kan ik het bestand correct lezen?


Antwoord 1, autoriteit 100%

Pickle serialiseert een enkel object tegelijk, en leest een enkel object terug –
de gepekelde gegevens worden in volgorde in het bestand opgenomen.

Als je gewoon pickle.loaddoet, zou je het eerste object in serie in het bestand moeten lezen (niet het laatste zoals je hebt geschreven).

Na het de-serialiseren van het eerste object, is de bestandsaanwijzer aan het begin
van het volgende object – als je gewoon opnieuw pickle.loadaanroept, zal het dat volgende object lezen – doe dat tot het einde van het bestand.

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

Antwoord 2, autoriteit 43%

Er is een read_picklefunctie als onderdeel van panda’s 0.22+

import pandas as pd
object = pd.read_pickle(r'filepath')

Antwoord 3, autoriteit 6%

Het volgende is een voorbeeld van hoe u een augurkbestand kunt schrijven en lezen. Merk op dat als u informatiedata aan het bestand bijhoudt, u moet blijven lezen van het bestand totdat u vindt wat u wilt of een uitzondering wordt gegenereerd door het einde van het bestand te bereiken. Dat is wat de laatste functie doet.

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()

Antwoord 4, Autoriteit 5%

Ik heb een softwaretool ontwikkeld die (de meeste) augurkbestanden rechtstreeks in uw browser opent (niets wordt overgedragen, dus het is 100% privé):

https://pickleviewer.com/ (voorheen)

Nu wordt het hier gehost: https://fire-6dca-273213.web.app/

EDIT: hier beschikbaar als u het ergens wilt hosten: https://github.com / CH-HRISTOV / PICKLE-VIEWER

Voel je vrij om dit ergens te hosten.

Other episodes