2010-03-11 8 views
83

Actuellement, je suis en utilisant ceci:Lire et écraser un fichier en Python

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 nouveau fichier qui a une partie de l'ancien fichier à la fin de celui-ci.

Répondre

142

Si vous ne voulez pas fermer et rouvrir le dossier, afin d'é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 cleaner and safer en utilisant with open as par le commentaire de mVChr, qui est de fermer 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() 
+9

Merci et bonne réponse. Je voulais aussi noter ici que la meilleure pratique est d'ouvrir le fichier dans un 'avec open (filename, 'r +') comme f:' block, de cette façon il ferme automatiquement le fichier à la fin du bloc même s'il y a une exception . – mVChr

14

Probablement il serait plus facile et plus facile de fermer le fichier après text = re.sub('foobar', 'bar', text), de le rouvrir en écriture (effaçant ainsi les anciens contenus) et d'y écrire le texte mis à jour.

14

Le module fileinput 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 courante de bouclage sur les lignes dans une liste de fichiers, via un objet qui conserve trace du nom de fichier, 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 
-3

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() 
Questions connexes