Prepende la línea al comienzo de un archivo

Puedo hacer esto usando un archivo separado, pero ¿cómo agrego una línea al comienzo de un archivo?

f=open('log.txt','a') f.seek(0) #get to the first position f.write("text") f.close() 

Esto comienza a escribir desde el final del archivo, ya que el archivo se abre en modo de adición.

En los modos 'a' o 'a+' , cualquier escritura se realiza al final del archivo, incluso si en el momento actual cuando se activa la función write() el puntero del archivo no está al final del archivo: el puntero está movido al final del archivo antes de cualquier escritura. Puedes hacer lo que quieras de dos maneras.

1ª forma , se puede usar si no hay problemas para cargar el archivo en la memoria:

 def line_prepender(filename, line): with open(filename, 'r+') as f: content = f.read() f.seek(0, 0) f.write(line.rstrip('\r\n') + '\n' + content) 

2ª vía :

 def line_pre_adder(filename, line_to_prepend): f = fileinput.input(filename, inplace=1) for xline in f: if f.isfirstline(): print line_to_prepend.rstrip('\r\n') + '\n' + xline, else: print xline, 

No sé cómo funciona este método bajo el capó y si se puede emplear en un archivo grande y grande. El argumento 1 pasado a la entrada es lo que permite reescribir una línea en su lugar; Las siguientes líneas deben moverse hacia adelante o hacia atrás para que se realice la operación in situ, pero no conozco el mecanismo.

En todos los sistemas de archivos con los que estoy familiarizado, no puedes hacer esto in situ. Debe usar un archivo auxiliar (que luego puede cambiar de nombre para tomar el nombre del archivo original).

Para poner el código a la respuesta de NPE, creo que la forma más eficiente de hacerlo es:

 def insert(originalfile,string): with open(originalfile,'r') as f: with open('newfile.txt','w') as f2: f2.write(string) f2.write(f.read()) os.rename('newfile.txt',originalfile) 

Idea diferente:

(1) Guarda el archivo original como una variable.

(2) Sobrescribe el archivo original con nueva información.

(3) Usted anexa el archivo original en los datos debajo de la nueva información.

Código:

 with open(,'r') as contents: save = contents.read() with open(,'w') as contents: contents.write(< New Information >) with open(,'a') as contents: contents.write(save) 

No hay forma de hacer esto con ninguna función incorporada, ya que sería terriblemente ineficiente. Deberá cambiar el contenido existente del archivo hacia abajo cada vez que agregue una línea en la parte frontal.

Hay una tail utilidad Unix / Linux que puede leer desde el final de un archivo. Quizás puedas encontrarlo útil en tu aplicación.

 num = [1, 2, 3] #List containing Integers with open("ex3.txt", 'r+') as file: readcontent = file.read() # store the read value of exe.txt into # readcontent file.seek(0, 0) #Takes the cursor to top line for i in num: # writing content of list One by One. file.write(str(i) + "\n") #convert int to str since write() deals # with str file.write(readcontent) #after content of string are written, I return #back content that were in the file 

La forma clara de hacerlo es la siguiente si no le importa volver a escribir el archivo.

 with open("a.txt", 'r+') as fp: lines = fp.readlines() # lines is list of line, each element '...\n' lines.insert(0, one_line) # you can use any index if you know the line index fp.seek(0) # file pointer locates at the beginning to write the whole file again fp.writelines(lines) # write whole lists again to the same file 

Tenga en cuenta que esto no es un reemplazo en el lugar. Está escribiendo un archivo de nuevo.

En resumen, usted lee un archivo y lo guarda en una lista, modifica la lista y escribe la lista nuevamente en un archivo nuevo con el mismo nombre de archivo.