Répond J'ai fini par aller avec des cornichons à la fin de toute façon
Ok donc avec quelques conseils sur une autre question que j'ai posée, on m'a dit d'utiliser des cornichons pour enregistrer un dictionnaire dans un fichier.
Le dictionnaire que j'essayais d'enregistrer dans le fichier était
members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'}
Lorsque cornichon l'a enregistré dans le fichier ... c'était le format
(dp0
S'Test'
p1
S'Test1'
p2
sS'Test2'
p3
S'Test2'
p4
sS'Starspy'
p5
S'SHSN4N'
p6
s.
Pouvez-vous s'il vous plaît me donner un autre moyen d'enregistrer la chaîne dans le fichier?
C'est le format dans lequel j'aimerais qu'il enregistre
members = {'Starspy': 'SHSN4N', 'Test': 'Test1'}
Code complet:
import sys
import shutil
import os
import pickle
tmp = os.path.isfile("members-tmp.pkl")
if tmp == True:
os.remove("members-tmp.pkl")
shutil.copyfile("members.pkl", "members-tmp.pkl")
pkl_file = open('members-tmp.pkl', 'rb')
members = pickle.load(pkl_file)
pkl_file.close()
def show_menu():
os.system("clear")
print "\n","*" * 12, "MENU", "*" * 12
print "1. List members"
print "2. Add member"
print "3. Delete member"
print "99. Save"
print "0. Abort"
print "*" * 28, "\n"
return input("Please make a selection: ")
def show_members(members):
os.system("clear")
print "\nNames", " ", "Code"
for keys in members.keys():
print keys, " - ", members[keys]
def add_member(members):
os.system("clear")
name = raw_input("Please enter name: ")
code = raw_input("Please enter code: ")
members[name] = code
output = open('members-tmp.pkl', 'wb')
pickle.dump(members, output)
output.close()
return members
#with open("foo.txt", "a") as f:
# f.write("new line\n")
running = 1
while running:
selection = show_menu()
if selection == 1:
show_members(members)
print "\n> " ,raw_input("Press enter to continue")
Elif selection == 2:
members == add_member(members)
print members
print "\n> " ,raw_input("Press enter to continue")
Elif selection == 99:
os.system("clear")
shutil.copyfile("members-tmp.pkl", "members.pkl")
print "Save Completed"
print "\n> " ,raw_input("Press enter to continue")
Elif selection == 0:
os.remove("members-tmp.pkl")
sys.exit("Program Aborted")
else:
os.system("clear")
print "That is not a valid option!"
print "\n> " ,raw_input("Press enter to continue")
Bien sûr, enregistrez-le au format CSV:
import csv
w = csv.writer(open("output.csv", "w"))
for key, val in dict.items():
w.writerow([key, val])
La lecture serait alors:
import csv
dict = {}
for key, val in csv.reader(open("input.csv")):
dict[key] = val
Une autre alternative serait json (json
pour la version 2.6+, ou installez simplejson
pour 2.5 et ci-dessous):
>>> import json
>>> dict = {"hello": "world"}
>>> json.dumps(dict)
'{"hello": "world"}'
Le format de sérialisation le plus courant de nos jours est JSON, qui est universellement pris en charge et représente très clairement les structures de données simples comme les dictionnaires.
>>> members = {'Starspy' : 'SHSN4N', 'Test' : 'Test1'}
>>> json.dumps(members)
'{"Test": "Test1", "Starspy": "SHSN4N"}'
>>> json.loads(json.dumps(members))
{u'Test': u'Test1', u'Starspy': u'SHSN4N'}
Le format YAML (via pyyaml) peut être une bonne option pour vous:
Bien que, contrairement à pp.pprint(the_dict)
, ce ne sera pas aussi joli, sera exécuté ensemble, str()
rend au moins un dictionnaire enregistrable de manière simple pour des tâches rapides:
f.write( str( the_dict ) )
Vous demandé
Je vais essayer. Comment spécifier à partir de quel fichier le vider/le charger?
Outre l'écriture dans une chaîne, le module json
fournit une méthode dump()
-, qui écrit dans un fichier:
>>> a = {'hello': 'world'}
>>> import json
>>> json.dump(a, file('filename.txt', 'w'))
>>> b = json.load(file('filename.txt'))
>>> b
{u'hello': u'world'}
Il existe également une méthode load()
pour la lecture.
Bien que je suggère pickle
, si vous voulez une alternative, vous pouvez utiliser klepto
.
>>> init = {'y': 2, 'x': 1, 'z': 3}
>>> import klepto
>>> cache = klepto.archives.file_archive('memo', init, serialized=False)
>>> cache
{'y': 2, 'x': 1, 'z': 3}
>>>
>>> # dump dictionary to the file 'memo.py'
>>> cache.dump()
>>>
>>> # import from 'memo.py'
>>> from memo import memo
>>> print memo
{'y': 2, 'x': 1, 'z': 3}
Avec klepto
, si vous aviez utilisé serialized=True
, le dictionnaire aurait été écrit dans memo.pkl
comme un dictionnaire mariné au lieu d'un texte clair.
Vous pouvez obtenir klepto
ici: https://github.com/uqfoundation/klepto
dill
est probablement un meilleur choix pour le décapage puis pickle
lui-même, car dill
peut sérialiser presque tout en python. klepto
peut également utiliser dill
.
Vous pouvez obtenir dill
ici: https://github.com/uqfoundation/dill