escribir () al principio del archivo?

Lo estoy haciendo así ahora, pero quiero que escriba al principio del archivo.

f = open('out.txt', 'a') # or 'w'? f.write("string 1") f.write("string 2") f.write("string 3") f.close() 

para que los contenidos de out.txt sean:

 string 3 string 2 string 1 

y no (como lo hace este código):

 string 1 string 2 string 3 

Echa un vistazo a esta pregunta . Hay algunas soluciones allí.

Aunque probablemente iría por el mismo camino que sugieren Daniel y MAK, tal vez haga una clase pequeña para hacer las cosas un poco más flexibles y explícitas:

 class Prepender: def __init__(self, fname, mode='w'): self.__write_queue = [] self.__f = open(fname, mode) def write(self, s): self.__write_queue.insert(0, s) def close(self): self.__exit__(None, None, None) def __enter__(self): return self def __exit__(self, type, value, traceback): if self.__write_queue: self.__f.writelines(self.__write_queue) self.__f.close() with Prepender('test_d.out') as f: f.write('string 1\n') f.write('string 2\n') f.write('string 3\n') 

Podría lanzar un f.seek(0) entre cada escritura (o escribir una función de envoltorio que lo haga por usted), pero no hay una forma simple de hacerlo.

EDIT : esto no funciona, incluso si pones f.flush() allí se sobrescribirá continuamente. Puede que solo tenga que poner en cola las escrituras y revertir el orden usted mismo.

Así que en lugar de

 f.write("string 1") f.write("string 2") f.write("string 3") 

Tal vez hacer algo como:

 writeList = [] writeList.append("string 1\n") writeList.append("string 2\n") writeList.append("string 3\n") writeList.reverse() f.writelines(writeList) 

Elaborando la respuesta de Daniel DiPaolo:

Simplemente agregue todas las líneas que desea escribir a una list . Invierta la list y luego escriba su contenido en el archivo.

 f=open('output.txt','w') l=[] l.append("string 1") l.append("string 2") l.append("string 3") for line in l: f.write(line) f.close() 

También puede usar un deque y agregar líneas al principio en lugar de usar una list y revertirla.

Una variación en la respuesta de kdtrv. Esta versión conserva el contenido del archivo existente y ofrece un método de write_lines que preserva el orden de las líneas.

 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', ] )