Actuellement, j'utilise ceci:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Mais le problème est que l'ancien fichier est plus volumineux que le nouveau fichier. Je me retrouve donc avec un nouveau fichier qui comporte une partie de l'ancien fichier à la fin.
Si vous ne voulez pas fermer et rouvrir le fichier, pour éviter les conditions de concurrence, vous pourriez truncate
it:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
La fonctionnalité peut également être plus propre et plus sûre en utilisant with open as
par commentaire de mVChr, qui ferme le gestionnaire, même en cas d'erreur.
with open(filename, 'r+') as f:
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
Il serait probablement plus facile et plus pratique de fermer le fichier après text = re.sub('foobar', 'bar', text)
, de le rouvrir pour l'écriture (et donc de supprimer l'ancien contenu) et d'y écrire votre texte mis à jour.
Le module fileinput
a un mode inline
pour écrire les modifications dans le fichier que vous traitez sans utiliser de fichiers temporaires, etc. Le module décrit bien l'opération courante de bouclage lignes dans une liste de fichiers, via un objet qui garde de manière transparente le nom du fichier, le numéro de ligne, etc. si vous souhaitez les inspecter à l’intérieur de la boucle.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line