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?

73
demandé sur martineau 2013-10-05 22:34:23

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 .

161
répondu Zah 2017-10-26 13:56:44

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"

FYI: NPY visionneuse de fichier

95
répondu Franck Dernoncourt 2017-04-13 12:50:02

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.

9
répondu John 2013-10-05 18:43:55

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')
3
répondu martineau 2013-10-05 22:27:43

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"
2
répondu mguijarr 2013-10-05 18:59:18

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))
2
répondu wordsforthewise 2017-11-07 23:38:12

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)
0
répondu junglejet 2018-08-27 17:57:09