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