Sauvegarde et chargement de plusieurs objets dans la saumure fichier?
J'ai une classe qui sert de joueurs dans un jeu, crée entre eux et d'autres choses.
J'ai besoin de sauvegarder ces player des objets dans un fichier pour l'utiliser plus tard. J'ai essayé le module pickle mais je ne sais pas comment faire pour enregistrer de multiples objets et, de nouveau, de les charger? Est-il un moyen de le faire ou dois-je utiliser d'autres classes, telles que des listes et de les enregistrer et de charger mes objets dans une liste?
Est-il un meilleur moyen?
- À l'aide de
list
comme conteneur semble raisonnable. - demander après 1 an. Ne pouvons-nous pas utiliser l'étagère de la bibliothèque de python pour la même tâche. Si pas ce qu'allait être l'inconvénient
Vous devez vous connecter pour publier un commentaire.
À l'aide d'une liste, tuple, ou dict est, de loin, la façon la plus courante pour ce faire:
Qui imprime:
Cependant, un cornichon fichier peut contenir n'importe quel nombre de cornichons. Voici le code de produire le même résultat. Mais notez que c'est plus difficile à écrire et à comprendre:
Si vous faites cela, vous êtes responsable de connaître le nombre de cornichons sont dans le fichier que vous écrivez. Le code ci-dessus n'est que par le décapage, le nombre d'objets de la liste de la première.
Deux ajouts à Tim Peters a accepté de répondre à.
Première, vous n'avez pas besoin de stocker le nombre d'articles que vous marinés séparément si vous arrêter le chargement quand vous frappez la fin du fichier:
Cela suppose que le fichier ne contient que des marinades; si il n'y a rien d'autre là, le générateur va essayer de traiter tout ce qui est là que les cornichons trop, ce qui pourrait être dangereux.
Deuxième, de cette façon, vous n'obtenez pas une liste, mais plutôt un générateur.
Cela va charger qu'un seul élément dans la mémoire, ce qui est utile
si les marchandises sous-évaluées de données est très large-l'une des raisons pourquoi vous pouvez
ont envie de cornichon plusieurs éléments séparément dans la première place.
Vous pouvez toujours effectuer une itération sur
items
avec unfor
boucle, comme si il ont étéune liste de.
load(myfilename)
ne pas charger les données ou de les lire à partir du fichier jusqu'à ce que vous itérer sur le résultat. Si vous souhaitez charger immédiatement, utilisez quelque chose commelist(load(myfilename))
ou unfor
boucle.yield
hors lewith open()
bloc? Accordé ce qui conduit à des lectures inutiles à parcourir le fichier pickle, mais je pense que je préfère cela à balançant des descripteurs de fichier. À moins que nous sommes sûrs que cette méthode sera toujours rapidement aux expressions du FOLKLORE, et nous fermons le fichier lorsque la fin du fichier est atteinte. (Mais si nous avons de la peine de rendement individuel des éléments c'est probablement parce que nous n'avons pas besoin de unpickle tous les objets dans un fichier.)with open
va se terminer et fermer correctement le fichier. Si elle ne peut pas être utilisé à sa fin, nous allons souvent pas de soins à propos de l'ouverture du fichier. Si elle ne peut pas être utilisé à sa fin et nous n'aimons pas le fichier ouvert, puis, oui, au-dessus de la construction n'est pas la meilleure façon d'aller.Essayez ceci:
Je vais donner un orientée objet de démonstration à l'aide de
pickle
pour stocker et restaurer une ou multiobject
:de sortie:
Il est facile si vous utilisez
klepto
, qui vous donne la possibilité de manière transparente stocker des objets dans des fichiers ou des bases de données. Il utilise un dict API, et vous permet dedump
et/ouload
entrées spécifiques à partir d'une archive (dans le cas ci-dessous, les objets sérialisés stockée une entrée par fichier dans un répertoire appeléscores
).Si vous êtes du dumping de manière itérative, vous auriez à le lire de manière itérative, en tant que bien.
Vous pouvez exécuter une boucle (comme le accepté de répondre à montre) de garder unpickling lignes jusqu'à ce que vous atteignez la fin de fichier (à quel point un
EOFError
est générée).Minimum Vérifiable Exemple
Bien sûr, c'est sous l'hypothèse que les objets doivent être traitées individuellement. Vous pouvez également stocker vos données dans une liste unique de l'objet, puis utilisez un seul cornichon/unpickle appel (pas besoin pour les boucles).