web-dev-qa-db-fra.com

Python remplacer et écraser au lieu d'ajouter

J'ai le code suivant:

import re
#open the xml file for reading:
file = open('path/test.xml','r+')
#convert to string:
data = file.read()
file.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data))
file.close()

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

31
Kaly

Vous devez utiliser truncate si vous voulez remplacer à la place: https://docs.python.org/3/library/os.html?highlight=truncate#os.truncate .__ Ou utilisez open(myfile, 'w') . Cela supprimera l'ancien fichier et en créera un nouveau.

AFAIK truncate ne change pas l'inode, mais open (..., 'w') créera un nouvel inode. Mais dans la plupart des cas, cela n'a pas d'importance. ... Je l'ai testé maintenant. Open (..., 'w') et truncate () ne modifient pas le numéro d'inode du fichier. (Testé deux fois: une fois avec Ubuntu 12.04 NFS et une fois avec ext4).

En passant, cela n’est pas vraiment lié à Python. L'interpréteur 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

47
guettli

En utilisant truncate(), la solution pourrait être

import re
#open the xml file for reading:
with open('path/test.xml','r+') as f:
    #convert to string:
    data = f.read()
    f.seek(0)
    f.write(re.sub(r"<string>ABC</string>(\s+)<string>(.*)</string>",r"<xyz>ABC</xyz>\1<xyz>\2</xyz>",data))
    f.truncate()
5
serv-inc
file='path/test.xml' 
with open(file, 'w') as filetowrite:
    filetowrite.write('new content')
    filetowrite.close()

Ouvrez le fichier en mode 'w', vous pourrez remplacer le texte actuel, enregistrez le fichier avec un nouveau contenu.

2
Chikku Jacob
import os#must import this library
if os.path.exists('TwitterDB.csv'):
        os.remove('TwitterDB.csv') #this deletes the file
else:
        print("The file does not exist")#add this to prevent errors

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

0
Nadia Salgado