Come si aggiunge a un file in Python?


1574

Come si accoda al file invece di sovrascriverlo? Esiste una funzione speciale che viene aggiunta al file?

Risposte:


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

10
Anche questo dal tutorial può essere utile.
Dan

28
Ho notato che molte persone stanno usando il with open(file, "a")metodo. Forse sono vecchio stile, ma qual è il vantaggio rispettoopen(file, "a") ... file.close()

75
bluewoodtree: i vantaggi sono simili a quelli di RAII in C ++. Se si dimentica close (), potrebbe essere necessario del tempo prima che il file venga effettivamente chiuso. È più facile che tu possa pensare di dimenticarlo quando il codice ha più punti di uscita, eccezioni e così via.
Petter,

54
print("appended text", file=myfile)è anche possibile, per un api più familiare.
Thomas Ahle,

206

È necessario aprire il file in modalità append, impostando "a" o "ab" come modalità. Vedi open () .

Quando si apre con la modalità "a", la posizione di scrittura sarà sempre alla fine del file (un'appendice). Puoi aprire con "a +" per consentire la lettura, cercare indietro e leggere (ma tutte le scritture rimarranno comunque 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 equivale ad aprirsi con 'w' e cercare fino alla fine del file - considera cosa potrebbe accadere se un altro programma aprisse il file e iniziasse a scrivere tra la ricerca e la scrittura. Su alcuni sistemi operativi, l'apertura del file con 'a' garantisce che tutte le tue scritture seguenti verranno aggiunte atomicamente alla fine del file (anche se il file cresce con altre scritture).


Qualche dettaglio in più su come funziona la modalità "a" ( testato solo su Linux ). Anche se cerchi 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'

In effetti, la fopen manpage afferma:

L'apertura di un file in modalità append (a come primo carattere della modalità) provoca tutte le successive operazioni di scrittura su questo flusso alla fine del file, come se precedesse la chiamata:

fseek(stream, 0, SEEK_END);

Vecchia risposta semplificata (non in uso with):

Esempio: ( in un programma reale utilizzare withper chiudere il file - consultare la documentazione )

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

49

Lo faccio sempre

f = open('filename.txt', 'a')
f.write("stuff")
f.close()

È semplice, ma molto utile.


12
è un po 'più bello e un po' più sicuro scrivere: con open ('nomefile', 'a') come f: f.write ('roba')
Sam Redway

35

Probabilmente vuoi passare "a"come argomento mode. Consulta i documenti per open () .

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

Esistono altre permutazioni dell'argomento mode per l'aggiornamento (+), troncamento (w) e binario (b) ma iniziare con just "a"è la soluzione migliore.


20
fileombreggia una funzione integrata. Non usarlo per le variabili.
Mark Tolonen,

11
@MarkTolonen: filenon è più incorporato in Python 3. Anche in Python 2, viene usato molto raramente . L'apertura di un file è un'operazione comune. Va bene usare il filenome qui su Python 2 e 3. Sapere quando essere incoerenti.
jfs,

34

Python ha molte varianti rispetto alle tre modalità principali, queste tre modalità sono:

'w'   write text
'r'   read text
'a'   append text

Quindi aggiungere a un file è facile come:

f = open('filename.txt', 'a') 
f.write('whatever you want to write here (in append mode) here.')

Quindi ci sono le modalità che rendono il tuo codice meno righe:

'r+'  read + write text
'w+'  read + write text
'a+'  append + read text

Infine, ci sono le modalità di lettura / scrittura in formato binario:

'rb'  read binary
'wb'  write binary
'ab'  append binary
'rb+' read + write binary
'wb+' read + write binary
'ab+' append + read binary

14

quando usiamo questa linea open(filename, "a"), ciò aindica l'aggiunta del file, ciò significa consentire l'inserimento di dati extra nel file esistente.

Puoi semplicemente usare le seguenti righe per aggiungere il testo nel tuo file

def FileSave(filename,content):
    with open(filename, "a") as myfile:
        myfile.write(content)

FileSave("test.txt","test1 \n")
FileSave("test.txt","test2 \n")

9

Puoi anche farlo con printinvece di write:

with open('test.txt', 'a') as f:
    print('appended text', file=f)

Se test.txt non esiste, verrà creato ...


6

È anche possibile aprire il file in r+modalità e quindi impostare la posizione del file alla fine del file.

import os

with open('text.txt', 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Aprire il file in r+modalità vi permetterà di scrivere ad altre posizioni di file, oltre alla fine, mentre ae a+la forza di scrittura fino alla fine.


4

se si desidera aggiungere a un file

with open("test.txt", "a") as myfile:
    myfile.write("append me")

Abbiamo dichiarato la variabile myfileper aprire un file denominato test.txt. Open accetta 2 argomenti, il file che vogliamo aprire e una stringa che rappresenta i tipi di autorizzazione o operazione che vogliamo fare sul file

ecco le opzioni della modalità file

Descrizione della modalità

'r' Questa è la modalità predefinita. Apre il file per la lettura.
'w' Questa modalità Apre il file per la scrittura. 
Se il file non esiste, crea un nuovo file.
Se il file esiste, tronca il file.
'x' Crea un nuovo file. Se il file esiste già, l'operazione non riesce.
'a' Apri il file in modalità append. 
Se il file non esiste, crea un nuovo file.
't' Questa è la modalità predefinita. Si apre in modalità testo.
'b' Si apre in modalità binaria.
'+' Questo aprirà un file per la lettura e la scrittura (aggiornamento)

4

Il 'a'parametro indica la modalità di aggiunta. Se non vuoi usarlo with openogni volta, puoi facilmente scrivere una funzione per farlo per te:

def append(txt='\nFunction Successfully Executed', file):
    with open(file, 'a') as f:
        f.write(txt)

Se vuoi scrivere altrove oltre alla fine, puoi usare 'r+' :

import os

with open(file, 'r+') as f:
    f.seek(0, os.SEEK_END)
    f.write("text to add")

Infine, il 'w+'parametro garantisce ancora più libertà. In particolare, consente di creare il file se non esiste, oltre a svuotare il contenuto di un file attualmente esistente.


Il merito di questa funzione va a @Primusa


2

Il modo più semplice per aggiungere più testo alla fine di un file sarebbe usare:

with open('/path/to/file', 'a+') as file:
    file.write("Additions to file")
file.close()

Il a+negli open(...)Istruisce istruzione per aprire il file in modalità di aggiunta e permette lettura e l'accesso in scrittura.

Inoltre, è sempre buona norma utilizzare file.close()per chiudere tutti i file aperti dopo averli utilizzati.


1
"file.close" viene chiamato automaticamente alla fine del blocco "con", che è il vantaggio della parola chiave. Inoltre, l'OP ha chiesto di aprire un file per l'aggiunta. La modalità "+" non è necessaria a meno che tu non voglia leggere anche.
Erik Knowles,

-6

Ecco la mia sceneggiatura, che in pratica conta il numero di righe, quindi le aggiunge, quindi le conta di nuovo in modo da avere le prove che ha funzionato.

shortPath  = "../file_to_be_appended"
short = open(shortPath, 'r')

## this counts how many line are originally in the file:
long_path = "../file_to_be_appended_to" 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines initially" %(long_path,i)
long.close()

long = open(long_path, 'a') ## now open long file to append
l = True ## will be a line
c = 0 ## count the number of lines you write
while l: 
    try: 
        l = short.next() ## when you run out of lines, this breaks and the except statement is run
        c += 1
        long.write(l)

    except: 
        l = None
        long.close()
        print "Done!, wrote %s lines" %c 

## finally, count how many lines are left. 
long = open(long_path, 'r')
for i,l in enumerate(long): 
    pass
print "%s has %i lines after appending new lines" %(long_path, i)
long.close()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.