J'utilise actuellement 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 contient une partie de l'ancien fichier à la fin.
f.write(text)
aprèsf.truncate()
?f.write(text)
est avantf.truncate()
dans ce code; il écrit letext
premier, donc après que.write()
le curseur de fichier soit positionné à la fin detext
. Le fait de tronquer le fichier supprimera tous les octets restants que le fichier pourrait avoir après ce point. Dans ce cas, le résultat final serait le même que si vous aviez tronqué avant d'écrire.fileinput
module peut devenir la méthode préférée. Une fois passéinplace=1
, il déplacera d'abord le fichier vers un emplacement temporaire, puis écrira un nouveau fichier dans l'ancien chemin du nom de fichier. Cette opération de déplacement est rapide sur les systèmes de fichiers Unix, car elle ne fait que déplacer le système de fichiersinode
, pas le contenu complet. Ensuite, vous pouvez lire et traiter chaque ligne individuellement pour éviter le gonflement de la mémoire. :-)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 l'ancien contenu) et d'y écrire votre texte mis à jour.la source
Le
fileinput
module a uninline
mode pour écrire les changements dans le fichier que vous traitez sans utiliser de fichiers temporaires, etc. numéro de ligne, etc. si vous voulez les inspecter à l'intérieur de la boucle.la source
Honnêtement, vous pouvez jeter un œil à cette classe que j'ai construite et qui effectue des opérations de base sur les fichiers. La méthode write écrase et ajoute conserve les anciennes données.
la source
Essayez de l'écrire dans un nouveau fichier.
la source