Una variación en la respuesta de kdtrv. Esta versión mantiene el contenido del archivo existente y ofrece un método write_lines que preserva el orden de la línea.
class Prepender(object):
def __init__(self,
file_path,
):
# Read in the existing file, so we can write it back later
with open(file_path, mode='r') as f:
self.__write_queue = f.readlines()
self.__open_file = open(file_path, mode='w')
def write_line(self, line):
self.__write_queue.insert(0,
"%s\n" % line,
)
def write_lines(self, lines):
lines.reverse()
for line in lines:
self.write_line(line)
def close(self):
self.__exit__(None, None, None)
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
if self.__write_queue:
self.__open_file.writelines(self.__write_queue)
self.__open_file.close()
with Prepender('test_d.out') as f:
# Must write individual lines in reverse order
f.write_line('This will be line 3')
f.write_line('This will be line 2')
f.write_line('This will be line 1')
with Prepender('test_d.out') as f:
# Or, use write_lines instead - that maintains order.
f.write_lines(
['This will be line 1',
'This will be line 2',
'This will be line 3',
]
)
¿Qué pasa si el uso de este era más como un archivo de registro, donde la secuencia de comandos puede escribir en el registro de las ejecuciones sucesivas? ¿Es el único recurso para mantener todo el archivo en la memoria, buscar al principio para escribir sus cosas seguido de todos los contenidos anteriores? (excluyendo la creación de archivos intermedios) –
No conozco nada en la clase 'file' de Python que permita algo como esto directamente (es decir, sin utilizar algún tipo de buffer intermedio). Entonces, en este momento, esto parece ser la forma más simple. Para un archivo de registro, ¿no tendría mucho más sentido y simplificaría la vida simplemente al agregar las entradas más nuevas al final del archivo? – MAK
@Nick, @MAK, no solo no hay nada en Python que pueda manejar esto, no hay nada en la biblioteca C subyacente o en el sistema de archivos. Esto simplemente no es cómo funcionan los archivos, y no se puede hacer crecer un archivo más que añadiendo a menos que esté dispuesto a copiar el contenido. Podría hacerse con un nuevo archivo o moviendo datos dentro del archivo anterior, pero de todos modos es muy probable que sea una mala idea. Mejor cambiar los requisitos o la forma en que ves el problema ... –