web-dev-qa-db-fra.com

Python pickle / décomple une liste vers / depuis un fichier

J'ai une liste qui ressemble à ceci:

a = [['a string', [0, 0, 0], [22, 'bee sting']], ['see string', 
    [0, 2, 0], [22, 'd string']]]

et j'ai des problèmes pour l'enregistrer et le récupérer.

Je peux l'enregistrer en utilisant du cornichon:

with open('afile','w') as f:
    pickle.dump(a,f)

mais j'obtiens l'erreur suivante lorsque j'essaye de la charger:

pickle.load('afile')

Traceback (most recent call last):
  File "<pyshell#116>", line 1, in <module>
    pickle.load('afile')
  File "C:\Python27\lib\pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "C:\Python27\lib\pickle.py", line 841, in __init__
    self.readline = file.readline
AttributeError: 'str' object has no attribute 'readline'

J'avais pensé que je pouvais convertir en un tableau numpy et utiliser save, savez ou savetxt. Cependant, j'obtiens l'erreur suivante:

>>> np.array([a])

Traceback (most recent call last):
  File "<pyshell#122>", line 1, in <module>
    np.array([a])
ValueError: cannot set an array element with a sequence
19
atomh33ls

Décidé de le faire comme réponse. La méthode pickle.load s'attend à obtenir un objet de type fichier, mais vous fournissez une chaîne à la place, et donc une exception. Donc au lieu de:

pickle.load('afile')

tu devrais faire:

pickle.load(open('afile', 'rb'))
35
Rapolas K.

Pour ajouter à la réponse de @ Rapolas K:

J'ai trouvé que j'avais des problèmes avec le fichier qui ne se fermait pas, j'ai donc utilisé cette méthode:

with open('afile','rb') as f:
     pickle.load(f)
16
atomh33ls