248 votes

Comment enregistrer un dictionnaire dans un fichier ?

J'ai un problème avec la modification de la valeur d'un dict et l'enregistrement du dict dans un fichier texte (le format doit être le même). member_phone domaine.

Mon fichier texte a 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

Lorsque j'essaie de modifier le member_phone stocké dans d La valeur a changé sans que la clé ne soit utilisée,

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 au même format ?

21voto

AgentOrangest Points 1

Je ne suis pas sûr que votre première question soit la bonne, mais si vous voulez enregistrer un dictionnaire dans un fichier, vous devez utiliser la fonction json bibliothèque. Consultez la documentation des fonctions loads et puts.

13voto

Kavin Sabharwal Points 139

Je vous suggère d'enregistrer vos données au format JSON plutôt qu'au format Pickle, car les fichiers JSON sont lisibles par l'homme, ce qui facilite le débogage puisque vos données sont de petite taille. Les fichiers JSON sont également utilisés par d'autres programmes pour lire et écrire des données. Vous pouvez en savoir plus à ce sujet aquí

Vous devez installer le module JSON, vous pouvez le faire avec pip :

pip install json

# To save the dictionary into a file:
json.dump( data, open( "myfile.json", 'w' ) )

Cela crée un fichier json avec le nom monfichier.

# To read data from file:
data = json.load( open( "myfile.json" ) )

Cette commande lit et stocke les données de monfichier.json dans un objet de données.

3voto

martineau Points 21665

Pour un dictionnaire de chaînes de caractères comme celui qui vous intéresse, il est possible d'utiliser uniquement les capacités de traitement de texte intégrées à Python.

(Notez que cela ne fonctionnerait pas si les valeurs étaient différentes).

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

2voto

mguijarr Points 4384

A moins que vous ne souhaitiez vraiment conserver le dictionnaire, je pense que la meilleure solution est d'utiliser la fonction csv Module Python pour lire le fichier. Vous obtenez alors des lignes de données et vous pouvez modifier les éléments suivants member_phone ou ce que vous voulez ; enfin, vous pouvez utiliser la fonction csv pour enregistrer le fichier dans le même format que celui dans lequel vous l'avez ouvert.

Code de lecture :

import csv

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

Code pour l'écriture :

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

Bien entendu, vous devez adapter votre change() fonction :

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"

1voto

wordsforthewise Points 2907

Je n'ai pas fait de chronométrage, mais je parie que h5 est plus rapide que pickle ; la taille des fichiers avec la compression est certainement plus petite.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X