2011-05-06 15 views
38

Puedo hacer esto usando un archivo separado, pero ¿cómo añado una línea al comienzo de un archivo?Línea de anteponer 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.

+19

No está incluido, eso está _pre_ pendiente. –

+5

posible duplicado de [Python f.write() al principio del archivo?] (Http://stackoverflow.com/questions/2677617/python-f-write-at-beginning-of-file) – geoffspear

Respuesta

58

En los modos 'a' o 'a+', cualquier escrito se hace al final del archivo, aunque en el momento actual, cuando la función write() se activa el puntero del archivo no se encuentra al final del archivo: el puntero se mueve a el final del archivo antes de cualquier escritura. Puedes hacer lo que quieras de dos maneras.

primera forma, se puede utilizar 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) 

segunda forma:

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 este método funciona bajo el capó y si puede ser empleado 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 se deben mover hacia delante o hacia atrás con el fin de que la operación in-situ se lleva a cabo, pero no conocen el mecanismo de

+1

'con abierto (nombre de archivo , 'r +') como f: 'cerrará el archivo? –

+2

@TomBrito Sí, la nueva instrucción ['with'] (https://docs.python.org/2/reference/compound_stmts.html#the-with-statement) le permite evitar el' 'try' /' común '/ común 'finalmente' código repetitivo. Fue agregado en la versión de Python '2.5'. –

+0

1st way quita la primera línea. – SanketDG

14

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

4

No hay forma de hacer esto con cualquier función incorporada, porque sería terriblemente ineficiente. Tendrá que cambiar el contenido existente del archivo cada vez que agregue una línea al frente.

Hay una utilidad Unix/Linux tail que puede leer desde el final de un archivo. Tal vez pueda encontrar eso útil en su aplicación.

6

Para poner el código de respuesta de la NPE, creo que la forma más eficiente de hacer esto 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) 
2
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 
Cuestiones relacionadas