La forma más corta probablemente sería usar el módulo de entrada de archivo . Por ejemplo, lo siguiente agrega números de línea a un archivo, en el lugar:
import fileinput
for line in fileinput.input("test.txt", inplace=True):
print('{} {}'.format(fileinput.filelineno(), line), end='') # for Python 3
# print "%d: %s" % (fileinput.filelineno(), line), # for Python 2
Lo que pasa aquí es:
- El archivo original se mueve a un archivo de respaldo
- La salida estándar se redirige al archivo original dentro del bucle
- Por lo tanto, cualquier
print
declaración vuelve a escribirse en el archivo original
fileinput
Tiene más campanas y silbatos. Por ejemplo, se puede usar para operar automáticamente en todos los archivos sys.args[1:]
, sin tener que repetirlos explícitamente. Comenzando con Python 3.2, también proporciona un administrador de contexto conveniente para usar en una with
declaración.
Si bien fileinput
es excelente para los scripts desechables, desconfiaría de usarlo en código real porque es cierto que no es muy legible o familiar. En el código real (de producción) vale la pena gastar unas pocas líneas de código más para hacer que el proceso sea explícito y, por lo tanto, hacer que el código sea legible.
Hay dos opciones:
- El archivo no es demasiado grande y puede leerlo completamente en la memoria. Luego cierre el archivo, vuelva a abrirlo en modo de escritura y vuelva a escribir el contenido modificado.
- El archivo es demasiado grande para ser almacenado en la memoria; puede moverlo a un archivo temporal y abrirlo, leyéndolo línea por línea, volviendo a escribirlo en el archivo original. Tenga en cuenta que esto requiere el doble de almacenamiento.
file
está sombreando una clase predefinida del mismo nombre.