web-dev-qa-db-fra.com

Qu'est-ce qui cause l'erreur "_pickle.UnpicklingError: clé de chargement invalide, ''."?

J'essaie de stocker 5000 éléments de données sur un tableau. Ces 5000 éléments sont stockés sur un fichier existant (donc ce n'est pas vide). 

Mais je reçois une erreur et je ne sais pas ce qui la cause.

DANS:

def array():

    name = 'puntos.df4'

    m = open(name, 'rb')
    v = []*5000

    m.seek(-5000, io.SEEK_END)
    fp = m.tell()
    sz = os.path.getsize(name)

    while fp < sz:
        pt = pickle.load(m)
        v.append(pt)

    m.close()
    return v

EN DEHORS:

line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
8
Xcecution

le décapage est récursif et non séquentiel. Ainsi, pour sélectionner une liste, pickle commencera à traiter la liste contenante, puis à conserver le premier élément… en plongeant dans le premier élément et en sélectionnant les dépendances et les sous-éléments jusqu'à ce que le premier élément soit sérialisé. Passe ensuite à l'élément suivant de la liste, et ainsi de suite, jusqu'à ce qu'il termine enfin la liste et termine la sérialisation de la liste englobante. En bref, il est difficile de traiter un cornichon récursif comme séquentiel, sauf dans certains cas particuliers. Il est préférable d'utiliser un modèle plus intelligent sur votre dump, si vous voulez load d'une manière spéciale.

Le cornichon le plus courant consiste à tout mariner avec une seule dump dans un fichier - mais vous devez alors load tout en même temps avec une seule load. Toutefois, si vous ouvrez un descripteur de fichier et effectuez plusieurs appels dump (par exemple, un pour chaque élément de la liste ou un tuple d'éléments sélectionnés), votre load reflétera le fait que… vous ouvrez le descripteur de fichier et effectuez plusieurs appels load jusqu'à ce que avoir tous les éléments de la liste et peut reconstruire la liste. Il n'est toujours pas facile de sélectionner load de manière sélective uniquement certains éléments de la liste. Pour ce faire, vous devrez probablement stocker vos éléments de liste sous la forme dict (avec l’index de l’élément ou du bloc comme clé) en utilisant un package tel que klepto, qui peut scinder de manière transparente plusieurs dict en plusieurs fichiers et les activer. chargement facile d'éléments spécifiques.

Enregistrement et chargement de plusieurs objets dans un fichier pickle?

8
Mike McKerns

Je ne suis pas tout à fait sûr de ce que vous essayez d'atteindre en recherchant un décalage spécifique et en essayant de charger des valeurs individuelles manuellement. L'utilisation typique du module pickle est la suivante:

# save data to a file
with open('myfile.pickle','wb') as fout:
    pickle.dump([1,2,3],fout)

# read data from a file
with open('myfile.pickle') as fin:
    print pickle.load(fin)

# output
>> [1, 2, 3]

Si vous avez vidé une liste, vous en chargerez une, il n'est pas nécessaire de charger chaque élément individuellement.

vous dites que vous avez eu une erreur avant de chercher l'offset -5000, le fichier que vous essayez de lire est peut-être corrompu.

Si vous avez accès aux données d'origine, je vous suggère d'essayer de les enregistrer dans un nouveau fichier et de les lire comme dans l'exemple.

3
yurib

Cela peut ne pas être pertinent pour votre problème spécifique, mais j'ai eu un problème similaire lorsque l'archive de cornichons avait été créée à l'aide de gzip.

Par exemple, si une archive pickle compressée est faite comme ceci,

import gzip, pickle
with gzip.open('test.pklz', 'wb') as ofp:
    pickle.dump([1,2,3], ofp)

Essayer de l'ouvrir jette les erreurs

 with open('test.pklz', 'rb') as ifp:
     print(pickle.load(ifp))
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
_pickle.UnpicklingError: invalid load key, ''.

Mais si le fichier de cornichon est ouvert en utilisant gzip tout est harmonieux

with gzip.open('test.pklz', 'rb') as ifp:
    print(pickle.load(ifp))

[1, 2, 3]
1
mishaF

Si vous avez transféré ces fichiers sur un disque ou par un autre moyen, il est probable qu'ils n'ont pas été enregistrés correctement.

0
foladev