Lire et écraser un fichier en Python
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 grand que le nouveau fichier. Donc je me retrouve avec un fichier qui a une partie de l'ancien fichier sur la fin.
4 réponses
Si vous ne voulez pas fermer et rouvrir le fichier, pour éviter les conditions de course, vous pouvez truncate
Il:
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 le commentaire de mVChr, qui fermera le gestionnaire, même si une erreur se produit.
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 propre de fermer le fichier après text = re.sub('foobar', 'bar', text)
, de le rouvrir pour l'écriture (effaçant ainsi les anciens contenus) et d'y écrire votre texte mis à jour.
Le fileinput
le module a un mode inline
pour écrire des modifications dans le fichier que vous traitez sans utiliser de fichiers temporaires, etc. Le module encapsule bien l'opération commune de boucler les lignes dans une liste de fichiers, via un objet qui conserve de manière transparente le nom du fichier, le numéro de ligne, etc. si vous voulez les inspecter dans la boucle.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
Essayez de l'écrire dans un nouveau fichier..
f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()