Actualmente estoy usando esto:
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 antiguo es más grande que el nuevo. Así que termino con un archivo nuevo que tiene una parte del archivo anterior al final.
f.write(text)
despuésf.truncate()
?f.write(text)
está antesf.truncate()
en este código; escribe eltext
primero, por lo que después de que.write()
el cursor del archivo se coloca al final detext
. Proceder a truncar el archivo eliminará los bytes restantes que pueda tener el archivo después de este punto. En este caso, el resultado final sería el mismo que si trunca antes de escribir.fileinput
módulo puede convertirse en el método preferido. Cuando se pasainplace=1
, primero moverá el archivo a una ubicación temporal y luego escribirá un nuevo archivo en la ruta del nombre de archivo anterior. Esta operación de movimiento es rápida en sistemas de archivos Unix, porque solo mueve el sistema de archivosinode
, no el contenido completo. Luego, puede leer y procesar cada línea individualmente para evitar la sobrecarga de la memoria. :-)Probablemente sería más fácil y ordenado cerrar el archivo después
text = re.sub('foobar', 'bar', text)
, volver a abrirlo para escribir (borrando así el contenido antiguo) y escribir el texto actualizado en él.fuente
El
fileinput
módulo tiene uninline
modo para escribir cambios en el archivo que está procesando sin usar archivos temporales, etc. El módulo encapsula muy bien la operación común de recorrer las líneas en una lista de archivos, a través de un objeto que realiza un seguimiento transparente del nombre del archivo, número de línea, etc. si desea inspeccionarlos dentro del bucle.fuente
Honestamente, puedes echar un vistazo a esta clase que construí y que realiza operaciones básicas de archivos. El método de escritura sobrescribe y anexa mantiene los datos antiguos.
fuente
Intente escribirlo en un archivo nuevo.
fuente