139 votes

Remplacez et écrasez au lieu d'ajouter

J'ai le code suivant :

import re
#ouvrir le fichier xml en lecture:
fichier = open('chemin/test.xml','r+')
#convertir en chaîne de caractères :
donnees = fichier.read()
fichier.write(re.sub(r"ABC(\s+)(.*)",r"ABC\1\2",donnees))
fichier.close()

où je voudrais remplacer l'ancien contenu qui se trouve dans le fichier par le nouveau contenu. Cependant, lorsque j'exécute mon code, le fichier "test.xml" est ajouté, c'est-à-dire que j'ai l'ancien contenu suivi du nouveau contenu "remplacé". Que puis-je faire pour supprimer l'ancien contenu et ne conserver que le nouveau ?

168voto

guettli Points 3284

Vous avez besoin de seek vers le début du fichier avant d'écrire, puis utilisez file.truncate() si vous voulez effectuer un remplacement inplace :

import re

myfile = "chemin/test.xml"

with open(myfile, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(re.sub(r"ABC(\s+)(.*)", r"ABC\1\2", data))
    f.truncate()

L'autre façon est de lire le fichier puis de l'ouvrir à nouveau avec open(myfile, 'w'):

with open(myfile, "r") as f:
    data = f.read()

with open(myfile, "w") as f:
    f.write(re.sub(r"ABC(\s+)(.*)", r"ABC\1\2", data))

Ni truncate ni open(..., 'w') ne changeront le numéro d' inode du fichier (j'ai testé deux fois, une fois avec Ubuntu 12.04 NFS et une fois avec ext4).

En passant, ceci n'est pas vraiment lié à Python. L'interprète appelle l'API de bas niveau correspondante. La méthode truncate() fonctionne de la même manière dans le langage de programmation C : Voir http://man7.org/linux/man-pages/man2/truncate.2.html

111voto

Chikku Jacob Points 195
fichier='chemin/test.xml' 
avec open(fichier, 'w') as fichieraécrire:
    fichieraécrire.write('nouveau contenu')

Ouvrez le fichier en mode 'w', vous pourrez remplacer son texte actuel et sauvegarder le fichier avec de nouveaux contenus.

19voto

user1587329 Points 91

En utilisant truncate(), la solution pourrait être

import re
#ouvrir le fichier xml en lecture:
with open('chemin/test.xml','r+') as f:
    #convertir en chaîne de caractères:
    data = f.read()
    f.seek(0)
    f.write(re.sub(r"ABC(\s+)(.*)",r"ABC\1\2",data))
    f.truncate()

2voto

Nadia Salgado Points 49
import os#doit importer cette bibliothèque
if os.path.exists('TwitterDB.csv'):
        os.remove('TwitterDB.csv') #cela supprime le fichier
else:
        print("Le fichier n'existe pas")#ajoutez ceci pour éviter les erreurs

J'ai eu un problème similaire, et au lieu d'écraser mon fichier existant en utilisant les différents 'modes', j'ai simplement supprimé le fichier avant de l'utiliser à nouveau, de sorte que ce serait comme si j'ajoutais à un nouveau fichier à chaque exécution de mon code.

2voto

Ch Usman Points 61

Dans mon cas le code suivant a fonctionné

with open("output.json", "w+") as outfile:  # en utilisant le mode w+ pour créer le fichier s'il n'existe pas et écraser le contenu existant
    json.dump(result_plot, outfile)

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