2011-08-25 22 views
10

Tengo que leer en un archivo, cambiar algunas secciones del texto aquí y allá, y luego escribir en el mismo archivo.Leer en el archivo - cambiar el contenido - escribir en el mismo archivo

Actualmente hago:

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

pero me imagino que hay un enfoque más Pythonic que da el mismo resultado.

Sugerencias?

Respuesta

16

Eso se ve claro, pero claro. Cualquier sugerencia depende de qué tan grandes sean los archivos. Si no es realmente enorme que se ve bien. Si es realmente grande, puede procesar en pedazos.

Pero podría usar un administrador de contexto para evitar los cierres explícitos.

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

No estoy seguro de que, en general, sugeriría leer en modo texto y escribir en binario aunque hago este tipo de cosas regularmente (incluso ayer) . –

+0

@dash Oh sí, acabo de lanzar eso. Realmente no hace ninguna diferencia en mi plataforma. ;-) – Keith

+0

sí, pero hace la diferencia con las cadenas de Unicode. –

4

Si trabajas línea por línea que puede utilizar fileinput con el modo inplace

import fileinput 

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

si necesita procesar todo el texto a la vez, entonces el código se puede optimizar un poco usando with que se encarga de cierre el archivo:

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

hecho, me hacer cosas expresiones regulares, etc. todo el archivo Puedo ver cómo mi pregunta no refleja que, la actualizaré – pseudosudo

-3

si necesita procesar todo el texto a la vez, entonces el código se puede optimizar un poco el uso con que se encarga de cerrar el archivo:

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

Esto parece haber sido copiado de la respuesta que @joaquin publicó en 2011. –

Cuestiones relacionadas