Comment sauvegarder un dictionnaire dans un fichier?
j'ai du mal à changer une valeur dict et à sauvegarder le dict dans un fichier texte (le format doit être le même), je veux seulement changer le champ member_phone
.
mon fichier texte est le format suivant:
memberID:member_name:member_email:member_phone
et je divise le fichier texte avec:
mdict={}
for line in file:
x=line.split(':')
a=x[0]
b=x[1]
c=x[2]
d=x[3]
e=b+':'+c+':'+d
mdict[a]=e
quand j'essaie de changer le member_phone
stocké dans d
, la valeur a changé pas le flux par la clé,
def change(mdict,b,c,d,e):
a=input('ID')
if a in mdict:
d= str(input('phone'))
mdict[a]=b+':'+c+':'+d
else:
print('not')
et comment sauvegarder le dict dans un fichier texte de même format?
7 réponses
Python a le module pickle juste pour ce genre de chose.
ces fonctions sont tout ce dont vous avez besoin pour sauvegarder et charger presque n'importe quel objet:
def save_obj(obj, name ):
with open('obj/'+ name + '.pkl', 'wb') as f:
pickle.dump(obj, f, pickle.HIGHEST_PROTOCOL)
def load_obj(name ):
with open('obj/' + name + '.pkl', 'rb') as f:
return pickle.load(f)
ces fonctions supposent que vous avez un dossier obj
dans votre répertoire de travail courant, qui sera utilisé pour stocker les objets.
notez ce cornichon.HIGHEST_PROTOCOL est un format binaire, qui ne pourrait pas être toujours pratique, mais il est bénéfique pour les performances. Le protocole 0 est un format de texte.
pour sauvegarder les collections de Python il y a le module shelve .
Pickle est probablement la meilleure option, mais au cas où quelqu'un se demande comment sauvegarder et charger un dictionnaire dans un fichier en utilisant NumPy:
import numpy as np
# Save
dictionary = {'hello':'world'}
np.save('my_file.npy', dictionary)
# Load
read_dictionary = np.load('my_file.npy').item()
print(read_dictionary['hello']) # displays "world"
Je ne sais pas quelle est votre première question, mais si vous voulez sauvegarder un dictionnaire dans un fichier, vous devriez probablement utiliser la bibliothèque JSON. Consultez la documentation des charges et les fonctions puts.
Voici comment cela pourrait être fait en utilisant seulement les capacités de traitement de texte intégrées de Python:
with open('members.txt') as file:
mdict={}
for line in file:
a, b, c, d = line.strip().split(':')
mdict[a] = b + ':' + c + ':' + d
a = input('ID: ')
if a not in mdict:
print('ID {} not found'.format(a))
else:
b, c, d = mdict[a].split(':')
d = input('phone: ')
mdict[a] = b + ':' + c + ':' + d # update entry
with open('members.txt', 'w') as file: # rewrite file
for id, values in mdict.items():
file.write(':'.join([id] + values.split(':')) + '\n')
sauf si vous voulez vraiment garder le dictionnaire, je pense que la meilleure solution est d'utiliser le module Python csv
pour lire le fichier.
Puis, vous obtenez des lignes de données et vous pouvez changer member_phone
ou ce que vous voulez ;
enfin, vous pouvez à nouveau utiliser le module csv
pour sauvegarder le fichier dans le même format.
comme vous l'avez ouvert.
Code pour la lecture:
import csv
with open("my_input_file.txt", "r") as f:
reader = csv.reader(f, delimiter=":")
lines = list(reader)
Code d'écriture:
with open("my_output_file.txt", "w") as f:
writer = csv.writer(f, delimiter=":")
writer.writerows(lines)
bien sûr, vous besoin d'adapter votre fonction change()
:
def change(lines):
a = input('ID')
for line in lines:
if line[0] == a:
d=str(input("phone"))
line[3]=d
break
else:
print "not"
Je ne l'ai pas chronométré mais je parie que h5 est plus rapide que pickle; le fichier avec compression est presque certainement plus petit.
import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
enregistrer et charger dict pour Fichier:
def save_dict_to_file(dic):
f = open('dict.txt','w')
f.write(str(dic))
f.close()
def load_dict_from_file():
f = open('dict.txt','r')
data=f.read()
f.close()
return eval(data)