Pickle dump actuelle remplace le fichier de données
Lorsque j'utilise cornichon, il fonctionne très bien et je peut vider de toute charge.
Le problème est que si je ferme le programme et essayer de vider encore une fois, il remplace l'ancien fichier de données avec la nouvelle dumping. Voici mon code:
import pickle
import os
import time
dictionary = dict()
def read():
with open('test.txt', 'rb') as f:
a = pickle.load(f)
print(a)
time.sleep(2)
def dump():
chs = raw_input('name and number')
n = chs.split()
dictionary[n[0]] = n[1]
with open('test.txt', 'wb') as f:
pickle.dump(dictionary, f)
Inpt = raw_input('Option : ')
if Inpt == 'read':
read()
else:
dump()
OriginalL'auteur MartinStone | 2013-12-17
Vous devez vous connecter pour publier un commentaire.
Lorsque vous ouvrez un fichier dans
w
mode (ouwb
), qui lui dit d'écrire un nouveau fichier, effacer tout ce qui était déjà là.Comme les docs dire:
En d'autres termes, vous voulez utiliser
'ab'
, pas'wb'
.Toutefois, lorsque vous ajoutez de nouvelles décharges pour le même fichier, vous vous retrouvez avec un fichier constitué de plusieurs valeurs distinctes. Si vous n'appelez
load
une fois, il va juste à charger la première. Si vous souhaitez charger tous d'entre eux, vous devez écrire le code qui le fait. Par exemple, vous pouvezload
dans une boucle jusqu'à ceEOFError
.Vraiment, il ressemble à ce que vous essayez de faire est de ne pas ajouter à la saumure fichier, mais à modifier la existant marinés dictionnaire.
Vous pouvez le faire avec une fonction qui charge et fusionne tous les dumps ensemble, comme ceci:
Mais qui va devenir de plus en plus lent, le plus de fois que vous exécutez votre programme, que vous pile sur plus de copies de ces mêmes valeurs. Pour faire droit vous devez charger le vieux dictionnaire, le modifier, et ensuite faire un dump de la version modifiée. Et pour cela, vous voulez
w
mode.Cependant, la meilleure façon de conserver un dictionnaire, au moins si les clés sont des chaînes de caractères, est d'utiliser
dbm
(si les valeurs sont des chaînes de caractères) ousoit
(autre) au lieu d'un dictionnaire en premier lieu.OriginalL'auteur abarnert
L'ouverture d'un fichier dans
"wb"
mode tronque le fichier -- c'est, il supprime le contenu du fichier, et vous permet ensuite de travailler sur elle.Habituellement, vous auriez du ouvrir le fichier dans append (
"ab"
) mode pour ajouter des données à la fin. Cependant, Pickle ne prend pas en charge l'ajout, de sorte que vous aurez à enregistrer vos données dans un nouveau fichier (venir avec un nom de fichier différent -- demander à l'utilisateur ou à l'utilisation d'un paramètre de ligne de commande tels que-o test.txt
?) chaque fois que le programme est exécuté.Sur un sujet connexe, ne pas utiliser de Cornichon. Il est dangereux. Envisager l'utilisation de JSON à la place (c'est dans la norme lib --
import json
).Pas de. Le décapant est intrinsèquement dangereuses (comme le module de documentation prend grand soin de mettre en garde, à plusieurs reprises), et
pickle.load
va exécuter du code arbitraire contenues dans le marinés fichier: michael-rushanan.blogspot.ca/2012/10/...Si vous n'essayez même pas de comprendre pourquoi le décapant est dangereux, vous allez finir par écrire le code qui est juste dangereux à l'aide de longues JSON ou autre. Ce que l'avertissement spécifiquement dit qu'il est "Le cornichon module n'est pas prévu à l'abri d'une erreur ou malicieusement construit de données." Si vous étendez JSON pour stocker et restaurer des classes personnalisées dans la manière évidente, il sera tout aussi incertain contre erronées ou malveillantes construit de données.
Plus généralement:
pickle
est évidemment pas une solution miracle qui résout tous les problèmes. Mais c'est pas complètement inutile module qui ne devrait jamais être utilisé. Si elle l'était, elle ne serait pas dans la bibliothèque standard. Propagation de RUMEUR à ce sujet pour aucune raison n'est bonne.OriginalL'auteur Max Noel