¿Cómo se añade a un archivo en Python?

¿Cómo se añade al archivo en lugar de sobrescribirlo? ¿Hay alguna función especial que añada al archivo?

Solución
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Comentarios (16)

Es necesario abrir el archivo en modo apéndice, estableciendo "a" o "ab" como modo. Véase open().

Cuando abres con el modo "a", la posición de escritura estará siempre al final del archivo (un apéndice). Puede abrir con "a+" para permitir la lectura, buscar hacia atrás y leer (¡pero todas las escrituras seguirán estando al final del archivo!).

Ejemplo:

>>> with open('test1','wb') as f:
        f.write('test')
>>> with open('test1','ab') as f:
        f.write('koko')
>>> with open('test1','rb') as f:
        f.read()
'testkoko'

Nota: Usar 'a' no es lo mismo que abrir con 'w' y buscar hasta el final del archivo - considere lo que podría suceder si otro programa abriera el archivo y comenzara a escribir entre la búsqueda y la escritura. En algunos sistemas operativos, abrir el archivo con 'a' garantiza que todas las escrituras siguientes se añadirán atómicamente al final del archivo (incluso cuando el archivo crezca por otras escrituras).


Algunos detalles más sobre cómo funciona el modo "a" (probado sólo en Linux). Incluso si busca hacia atrás, cada escritura se añadirá al final del archivo:

>>> f = open('test','a+') # Not using 'with' just to simplify the example REPL session
>>> f.write('hi')
>>> f.seek(0)
>>> f.read()
'hi'
>>> f.seek(0)
>>> f.write('bye') # Will still append despite the seek(0)!
>>> f.seek(0)
>>> f.read()
'hibye'

De hecho, el manpage de fopen afirma:

Abrir un archivo en modo append (a como primer carácter de modo) hace que todas las operaciones de escritura subsecuentes a este flujo ocurran al final del archivo, como si precedieran a la llamada

fseek(stream, 0, SEEK_END);


Antigua respuesta simplificada (sin usar with):

Ejemplo: (en un programa real usar with para cerrar el archivo - ver la documentación)

>>> open("test","wb").write("test")
>>> open("test","a+b").write("koko")
>>> open("test","rb").read()
'testkoko'
Comentarios (3)

Probablemente quiera pasar "a" como argumento de modo. Consulte la documentación de open().

with open("foo", "a") as f:
    f.write("cool beans...")

Hay otras permutaciones del argumento de modo para actualizar (+), truncar (w) y el modo binario (b), pero empezar con sólo "a" es su mejor opción.

Comentarios (2)