Come si aggiunge a un file in Python?

Come si fa ad aggiungere al file invece di sovrascriverlo? C'è una funzione speciale che aggiunge al file?

Soluzione
with open("test.txt", "a") as myfile:
    myfile.write("appended text")
Commentari (16)

Dovete aprire il file in modalità append, impostando "a" o "ab" come modalità. Vedere open().

Quando aprite con la modalità "a", la posizione di scrittura sarà sempre alla fine del file (un'append). Potete aprire con "a+" per permettere la lettura, cercare all'indietro e leggere (ma tutte le scritture saranno ancora alla fine del file!).

Esempio:

>>> 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: Usare 'a' non è la stessa cosa che aprire con 'w' e cercare fino alla fine del file - considerate cosa potrebbe succedere se un altro programma aprisse il file e iniziasse a scrivere tra la ricerca e la scrittura. Su alcuni sistemi operativi, aprire il file con 'a' garantisce che tutte le vostre successive scritture saranno aggiunte atomicamente alla fine del file (anche se il file cresce con altre scritture).


Qualche altro dettaglio su come funziona la modalità "a" (testato solo su Linux). Anche se si cerca indietro, ogni scrittura verrà aggiunta alla fine del file:

>>> 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'

Infatti, la manpage di fopen afferma:

Aprire un file in modalità append (a come primo carattere della modalità) fa sì che tutte le successive operazioni di scrittura su questo flusso avvengano a fine del file, come se precedesse la chiamata:

fseek(stream, 0, SEEK_END);


Vecchia risposta semplificata (non usando with):

Esempio: (in un programma reale usa with per chiudere il file - vedi la documentazione)

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

Probabilmente volete passare "a" come argomento di modalità. Vedi la documentazione per open().

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

Ci sono altre permutazioni dell'argomento mode per l'aggiornamento (+), il troncamento (w) e il modo binario (b), ma iniziare con solo "a" è la scelta migliore.

Commentari (2)