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.

84
demandé sur compie 2010-03-11 13:01:43

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()
149
répondu nosklo 2017-05-23 11:54:47

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.

15
répondu Il-Bhima 2010-03-11 10:04:09

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
14
répondu ghostdog74 2016-01-11 05:54:44

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()
-2
répondu sk7979 2016-06-29 11:59:40