web-dev-qa-db-fra.com

Comment enregistrer un dictionnaire dans un fichier?

J'ai du mal à changer une valeur dict et à enregistrer le dict dans un fichier texte (le format doit être identique), je souhaite uniquement modifier le champ member_phone.

Mon fichier texte est au format suivant:

memberID:member_name:member_email:member_phone

et je scinde 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 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 enregistrer le dict dans un fichier texte avec le même format?

87
XueYuan Wang

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 tous les objets:

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 ayez un dossier obj dans votre répertoire de travail actuel, qui sera utilisé pour stocker les objets.

Notez que pickle.HIGHEST_PROTOCOL est un format binaire, qui ne peut pas toujours être pratique, mais qui est bon pour la performance. Le protocole 0 est un format de texte.

Afin de sauvegarder des collections de Python, il existe le module shelve

191
Zah

Pickle est probablement la meilleure option, mais au cas où quelqu'un se demanderait 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: Visionneuse de fichiers NPY

117
Franck Dernoncourt

Je ne sais pas quelle est votre première question, mais si vous souhaitez enregistrer un dictionnaire, vous devez utiliser la bibliothèque json. Recherchez la documentation des charges et des fonctions.

13
John

Sauvegarder et charger dict dans un 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)
6
junglejet

Pour un dictionnaire de chaînes tel que celui avec lequel vous traitez, vous pouvez utiliser uniquement les fonctionnalités de traitement de texte intégrées de Python. 

(Notez que cela ne fonctionnerait pas si les valeurs sont autre chose.)

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')
2
martineau

Nous pouvons également utiliser le module json dans le cas où des dictionnaires ou d'autres données peuvent facilement être mappés au format JSON .

Sérialiser les données dans un fichier:

import json
json.dump( data, open( "file_name.json", 'w' ) )

Lire les données du fichier:

import json
data = json.load( open( "file_name.json" ) )

Cette solution apporte de nombreux avantages, par exemple fonctionne pour Python 2.x et Python 3.x sous une forme inchangée et, en outre, les données enregistrées dansJSONformat peut être facilement transféré entre de nombreuses plates-formes ou programmes. Ces données sont également lisibles par l'homme.

2
simhumileco

Je ne l'ai pas chronométré mais je parie que h5 est plus rapide que pickle; la taille du fichier avec compression est presque certainement plus petite.

import deepdish as dd
dd.io.save(filename, {'dict1': dict1, 'dict2': dict2}, compression=('blosc', 9))
2
wordsforthewise

À moins que vous ne vouliez vraiment conserver le dictionnaire, je pense que la meilleure solution consiste à utiliser le module csv de Python pour lire le fichier . Ensuite, vous obtenez des lignes de données et vous pouvez modifier member_phone ou ce que vous voulez; , vous pouvez à nouveau utiliser le module csv pour enregistrer le fichier dans le même format.

Code de lecture:

import csv

with open("my_input_file.txt", "r") as f:
   reader = csv.reader(f, delimiter=":")
   lines = list(reader)

Code pour écrire:

with open("my_output_file.txt", "w") as f:
   writer = csv.writer(f, delimiter=":")
   writer.writerows(lines)

Bien sûr, vous devez 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
mguijarr

Solution rapide et incorrecte: convertissez le dict en chaîne et enregistrez-le dans un fichier, par exemple:

#dict could be anything:

savedict = open('savedict001.txt', 'w')
savedict.write(str(dict))
savedict.close()
0
Patrick Stacey