2010-03-11 13 views
83

Actualmente estoy usando esto:Lea y sobrescribir un archivo en Python

f = open(filename, 'r+') 
text = f.read() 
text = re.sub('foobar', 'bar', text) 
f.seek(0) 
f.write(text) 
f.close() 

Pero el problema es que el archivo de edad es mayor que el nuevo archivo. Así que termino con un nuevo archivo que tiene una parte del archivo anterior al final.

Respuesta

142

Si no desea cerrar y volver a abrir el archivo, para evitar las condiciones de carrera, podría truncate que:

f = open(filename, 'r+') 
text = f.read() 
text = re.sub('foobar', 'bar', text) 
f.seek(0) 
f.write(text) 
f.truncate() 
f.close() 

La funcionalidad también puede ser cleaner and safer usando with open as por el comentario de mVChr, que cerrará el controlador, incluso si ocurre un error.

with open(filename, 'r+') as f: 
    text = f.read() 
    text = re.sub('foobar', 'bar', text) 
    f.seek(0) 
    f.write(text) 
    f.truncate() 
+9

Gracias y buena respuesta. También quería señalar aquí que la mejor práctica es abrir el archivo en un 'con abrir (nombre de archivo, 'r +') como bloque f:', de esa manera se cierra automáticamente el archivo al final del bloque, incluso si hay una excepción . – mVChr

14

Probablemente sería más fácil y más limpio para cerrar el archivo después de text = re.sub('foobar', 'bar', text), volver a abrirlo para escribir (a fin de despejar contenidos de edad), y escribir el texto actualizado a la misma.

14

El módulo fileinput tiene un modo de escritura inline cambios en el archivo que está procesando sin usar archivos temporales, etc. El módulo encapsula muy bien el funcionamiento común de bucle sobre las líneas en una lista de archivos, a través de un objeto que mantiene de forma transparente rastrear el nombre del archivo, el número de línea, etc., si desea inspeccionarlos dentro del ciclo.

import fileinput 
for line in fileinput.FileInput("file",inplace=1): 
    if "foobar" in line: 
     line=line.replace("foobar","bar") 
    print line 
-3

intentar escribir en un nuevo archivo ..

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