2011-08-25 5 views
10

Je dois lire dans un fichier, modifier une section du texte ici et là, puis écrire dans le même fichier.Lire dans le fichier - changer le contenu - écrire au même fichier

Actuellement je fais:

f = open(file) 
file_str = f.read() # read it in as a string, Not line by line 
f.close() 
# 
# do_actions_on_file_str 
# 
f = open(file, 'w') # to clear the file 
f.write(file_str) 
f.close() 

Mais j'imagine qu'il ya une approche plus pythonique qui donne le même résultat.

Suggestions?

Répondre

16

Cela semble simple et clair déjà. Toute suggestion dépend de la taille des fichiers. Si ce n'est pas vraiment énorme, ça a l'air bien. Si vraiment grand, vous pourriez traiter en morceaux.

Mais vous pouvez utiliser un gestionnaire de contexte, pour éviter les fermetures explicites.

with open(filename) as f: 
    file_str = f.read() 

# do stuff with file_str 

with open(filename, "w") as f: 
    f.write(file_str) 
+3

Je ne suis pas sûr que je suggère généralement de lire en mode texte et d'écrire en binaire bien que je fasse ce genre de chose régulièrement (y compris hier) . –

+0

@dash Oh oui, j'ai juste jeté ça. Ça ne fait pas vraiment de différence sur ma plateforme. ;-) – Keith

+0

ouais mais ça fait la différence avec les chaînes Unicode. –

4

Si vous travaillez ligne par ligne, vous pouvez utiliser fileinput avec le mode inplace

import fileinput 

for line in fileinput.input(mifile, inplace=1): 
    print process(line) 

si vous avez besoin de traiter tout le texte à la fois, votre code peut être optimisé un peu en utilisant with qui prend soin de fermeture le fichier:

with open(myfile) as f: 
    file_str = f.read() 
# 
do_actions_on_file_str 
# 
with open(myfile, 'w') as f: 
    f.write(file_str) 
+0

je fait des choses regex, etc. le fichier entier. Je peux voir comment ma question ne reflète pas cela, je vais le mettre à jour – pseudosudo

-3

si vous avez besoin de traiter tout le texte à la fois, votre code peut être optimisé un peu en utilisant avec qui prend soin de fermer le fichier:

with open(myfile) as f: 
    file_str = f.read() 
# 
do_actions_on_file_str 
# 
with open(myfile, 'w') as f: 
    f.write(file_str) 
+1

Cela semble avoir été copié à partir de la réponse que @joaquin a publiée en 2011. –

Questions connexes