web-dev-qa-db-fra.com

Lire et écraser un fichier dans 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 volumineux que le nouveau fichier. Je me retrouve donc avec un nouveau fichier qui comporte une partie de l'ancien fichier à la fin.

93
compie

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()
164
nosklo

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.

15
Il-Bhima

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
14
ghostdog74