web-dev-qa-db-fra.com

Comment écrire un dictionnaire dans un fichier existant?

Disons que j'ai un dictionnaire et que je veux l'écrire dans un fichier existant. Comment puis-je le faire sans perdre quoi que ce soit qui pourrait déjà exister dans le fichier? Ce à quoi je pensais, c'est de faire ce qui suit:

def write_report(r, filename):
        input_filename=open(filename, "a")
        input_filename.close()
        for (k,v) in r.items():
               input_filename.write(k,v)
        return filename

ce que je veux m'assurer, c'est que le nom de fichier contient correctement le dictionnaire.

14
user300

Vous pouvez utiliser le module json pour lire et écrire des structures de données au format JSON (en d'autres termes, sérialiser en JSON et désérialiser à partir de JSON). Par exemple:

import json

# load from file:
with open('/path/to/my_file.json', 'r') as f:
    try:
        data = json.load(f)
    # if the file is empty the ValueError will be thrown
    except ValueError:
        data = {}

# save to file:
with open('/path/to/my_file.json', 'w') as f:
    data['new_key'] = [1, 2, 3]
    json.dump(data, f)
25
Eugene Naydenov

cornichon peut être un autre choix:

import pickle

output = open('output.txt', 'ab+')
data = {'a': [1, 2, 3],}

pickle.dump(data, output)
output.close()

# read data
output = open('output.txt', 'rb')
obj_dict = pickle.load(output)    # 'obj_dict' is a dict object

Mais seules les données sérialisées par pickle peuvent être lues à l'aide de pickle.load. Donc, si vous voulez lire toutes les données du fichier, vous devez pickle.dump toutes les données dans le fichier.

7
flyer

Si vous souhaitez ajouter une représentation textuelle de chaque paire clé-valeur du dictionnaire dans un fichier texte, vous pouvez envisager l'approche suivante:

def write_report(r, filename):
    input_file=open(filename, "a")
    for k, v in r.items():
        line = '{}, {}'.format(k, v) 
        print(line, file=input_file)        
    input_file.close()

Ce qui précède peut être exprimé plus clairement avec la déclaration with.

def write_report(r, filename):    
    with open(filename, "a") as input_file:
        for k, v in r.items():
            line = '{}, {}'.format(k, v) 
            print(line, file=input_file)
2
mediocrity

Ce que vous avez déjà fait en utilisant open(filename, "a") utilise le mode ajout - qui est presque tout ce dont vous avez besoin. En mode ajout, vous n'écraserez jamais ce qui se trouve déjà dans le fichier. Le problème est que cela ne garantit pas que vous êtes le seul à écrire - et si des écritures peuvent être partielles, elles peuvent apparaître brouillées s'il y a jamais plusieurs écrivains travaillant sur le même fichier. Ce genre de problème peut être évité en utilisant verrouillage de fichier .

Le code que vous avez publié présente cependant quelques problèmes supplémentaires, tels que la fermeture du fichier avant d'y écrire et le fait que l'écriture n'accepte qu'un seul argument de chaîne. Vous voudrez sérialiser les données en morceaux gérables, pour lesquels le propre module standard de Python est pickle (et shelve stocke les choses dans des fichiers de base de données), et JSON est un support plus largement pris en charge format.

0
Yann Vernier