Quelles sont les causes de l'erreur “_pickle.UnpicklingError: invalid charge"'.”?
Je suis en train de stockage de 5000 éléments de données sur un tableau. Ce 5000 éléments de stockage sur un fichier existant (donc il n'est pas vide).
Mais j'obtiens une erreur et je ne sais pas ce qui en est la cause.
:
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
:
line 23, in array
pt = pickle.load(m)
_pickle.UnpicklingError: invalid load key, ''.
peut-être que je manque quelque chose, mais on dirait que vous êtes en supposant que chaque valeur a une taille d'un octet, pourquoi vous pensez que c'est-il garanti? et pourquoi essayez-vous de unpickle valeurs individuelles manuellement? était le fichier créé à l'aide du module pickle?
Bon, je n'ai pas d'avis mais si je supprime le "m.seek(-5000, io.SEEK_END)" partie, j'ai eu une EOFError. Je pensais que résolu, mais maintenant vous mentionner que je suis plus confus. Dois-je modifier la Question?
Oh, et oui, le fichier a été créé à l'aide de la dump() la fonction du module pickle
Bon, je n'ai pas d'avis mais si je supprime le "m.seek(-5000, io.SEEK_END)" partie, j'ai eu une EOFError. Je pensais que résolu, mais maintenant vous mentionner que je suis plus confus. Dois-je modifier la Question?
Oh, et oui, le fichier a été créé à l'aide de la dump() la fonction du module pickle
OriginalL'auteur Xcecution | 2015-10-10
Vous devez vous connecter pour publier un commentaire.
le décapage est récursive, et non séquentielle. Ainsi, pour mariner une liste,
pickle
va commencer à pickle l'contenant la liste, puis cornichon le premier élément... une plongée dans le premier élément et le décapage des dépendances et des sous-éléments jusqu'à ce que le premier élément est sérialisé. Puis se déplace vers le prochain élément de la liste, et ainsi de suite, jusqu'à ce qu'il termine enfin la liste et les finitions de la sérialisation de l'affichage de liste. En bref, il est difficile de traiter un appel récursif à pickle séquentielle, à l'exception de quelques cas particuliers. Il est préférable d'utiliser une solution plus intelligente motif sur votredump
, si vous voulezload
d'une manière spéciale.Le plus commun, cornichon, cornichon tout avec une seule
dump
à un fichier -- mais alors vous devezload
tout à la fois avec un seulload
. Toutefois, si vous ouvrez un descripteur de fichier et de faire de multiplesdump
appels (par exemple un pour chaque élément de la liste, ou un n-uplet d'éléments sélectionnés), puis votreload
sera le miroir que... vous ouvrez le fichier de gérer et de faire de multiplesload
appels jusqu'à ce que vous avez tous les éléments de la liste et permet de reconstituer la liste. C'est pas toujours facile sélectivementload
seulement certains éléments d'une liste, cependant. Pour ce faire, vous auriez probablement stocker votre liste d'élémentsdict
(avec l'index de l'élément ou de morceau de la clé), à l'aide d'un package commeklepto
, qui peut briser une marinésdict
en plusieurs fichiers de façon transparente, et permet de charger facilement des éléments spécifiques.Sauvegarde et chargement de plusieurs objets dans la saumure fichier?
OriginalL'auteur Mike McKerns
Je ne suis pas complètement sûr de ce que vous essayez d'atteindre d'ici à la recherche à un décalage et d'essayer de charger les valeurs individuelles manuellement, l'utilisation typique de la
pickle
module est:Si vous sous-évaluées d'une liste, vous pourrez charger une liste, il n'y a pas besoin de charger chaque élément individuellement.
vous êtes en train de dire que vous avez fait une erreur avant de vous étaient à la recherche à la -5000 décalage, peut-être que le fichier que vous essayez de lire est endommagé.
Si vous avez accès à des données d'origine, je vous suggère d'essayer de l'enregistrer dans un nouveau fichier et le lire comme dans l'exemple.
Salut, je pourrais résoudre le problème. Je ne sais pas comment, mais j'ai juste enlevé le "fp" variable et la j'ai mis "tandis que m.tell() < sz:" au lieu de "tout en fp < sz:". Merci quand même :), et si vous savez la raison de cette "solution" je vous serais reconnaissant si vous pouviez me l'expliquer.
OriginalL'auteur yurib
Cela peut ne pas être pertinents à votre problème spécifique, mais j'ai eu un problème similaire lors de la saumure archives avaient été créés à l'aide de
gzip
.Par exemple, si un comprimé pickle archive est faite comme cela,
Essaie de l'ouvrir, jette les erreurs
Mais, si le cornichon fichier est ouvert à l'aide de
gzip
tout est harmonieuxOriginalL'auteur mishaF
Si vous transférez ces fichiers par disque ou par d'autres moyens, il est probable qu'ils n'ont pas été enregistrés correctement.
OriginalL'auteur foladev