2017-08-24 1 views
1

Je suis en train de comprendre comment ajouter des données dans les données déjà enregistrées avec cornichon en PythonEssayer d'ajouter des données enregistrées avec cornichon en Python

import pickle 
load_written_things = open("written_things.pkl", "rb") 
added_stuff = input("write:") 
written_things = pickle.load(load_written_things) + pickle.dump(added_stuff, open("written_things.pkl", "wb"))               
print (written_things) 

j'avais déjà créé le written_things.pkl et moi avions écrit quelque chose dedans, pendant que j'écrivais du code pour sth else. Maintenant, je veux ajouter des choses et un erreur apparaît en disant EOFError: Ran out of input. J'ai essayé à plusieurs reprises d'ajouter des choses de différentes manières, mais je ne peux pas trouver un moyen, même si j'ai cherché une solution sur YouTube et sur débordement de pile.

Répondre

0

Vous pouvez essayer ce qui suit:

import pickle 

load_written_things = open("written_things.pkl", "rb") 
added_stuff = raw_input("write: ") 
written_things = pickle.load(load_written_things) + added_stuff 

pickle.dump(written_things, open("written_things.pkl", "wb"))               
print (written_things) 

Update for the 2nd question:

Eh bien, disons que vous avez déversé une liste initiale 'written_things.pkl' comme ceci:

#!/usr/bin/env python 

import pickle 

# initial list dumped in 'written_things.pkl' 
alist = ['name1', 'name2', 'name3'] 
with open('written_things.pkl', 'wb') as f: pickle.dump(alist,f) 

Maintenant, si je compris correctement, vous voulez mettre à jour cette liste avec de nouveaux éléments et vider la nouvelle liste/résultat dans 'written_things.pkl' en utilisant pickle. Une façon de le faire serait la suivante:

# old stuff 
load_written_things = open("written_things.pkl", "rb") 
old = pickle.load(load_written_things) 

new_item = raw_input('>> New item: ') 
with open("written_things.pkl", "w") as f: 
    pickle.dump(old+[new_item], f) 

# to read back the data 
with open("written_things.pkl", "rb") as f: 
    data = pickle.load(f) 

ont à l'esprit que de cette manière nous ajoutons un élément à la fois. Donc, si vous voulez saisir plusieurs éléments à la fois, vous pouvez entrer vos articles comme celui-ci: item1,item2,item3 etc ... (ou tout autre séparateur), puis remplacer la ligne:

pickle.dump(old+[new_item], f) --with ->pickle.dump(old+new_item.split(','), f)

Également une autre chose à considérer comme mentionné here, est que le module pickle est pas sécurisé contre les données erronées ou mal construites. Cela signifie que vous devez vous assurer que les données du fichier .pkl ne sont pas malveillantes. Il existe de nombreuses techniques dans la nature qui permettent l'exécution de code arbitraire avec les cornichons de python.

Comme juste une alternative à pickle vous pouvez toujours mettre votre sortie (peut être une liste, un dictionnaire etc ...) dans un fichier, puis utiliser ast.literal_eval pour relire vos données. Comme mentionné dans le module lui-même et aussi here, ast.literal_eval est considéré comme sûr à utiliser.

+0

Merci pour la réponse. Juste une question. Comment puis-je faire chaque chose ajoutée une entrée séparée dans une liste ou un dictionnaire. Je veux faire un Gui dans lequel les noms seront stockés par l'utilisateur et apparaîtront dans l'étiquette ou la liste. Donc, s'il y a un moyen de séparer chaque donnée ajoutée, j'aimerais vraiment le savoir. Merci encore pour la réponse et merci si vous répondez à cette deuxième question –

+0

@GiannisGiannoulas J'ai ajouté une réponse possible à votre 2ème question! – coder

+0

Merci j'apprécie vraiment votre aide. J'essayais de comprendre pendant 6 heures comment le faire. Et enfin je connais le chemin. –

0

Essayez les solutions suivantes.

import pickle 

added_stuff = raw_input("write:") 
pickle.dump(added_stuff, open("written_things.pkl","a"))               

print added_stuff 

Fondamentalement, ceci ajoute votre entrée dans le script_things.pkl.

~ Utilisation de python 2.7.6