Differenza tra le modalità a, a +, w, w + e r + nella funzione di apertura integrata?


610

Nella pitone incorporata aperto funzione, qual è la differenza esatta tra le modalità w, a, w+, a+, e r+?

In particolare, la documentazione implica che tutti questi consentiranno la scrittura nel file e afferma che apre i file per "aggiungere", "scrivere" e "aggiornare" in modo specifico, ma non definisce cosa significano questi termini.


11
Il collegamento fornito definisce esattamente i valori. Quale parte del link fornita non è possibile visualizzare o comprendere? Potresti chiarire la tua domanda per spiegare cosa non hai capito riguardo al link?
S.Lott

@ChrisB. - L'ho segnalato come bug su bugs.python.org/issue19627
Bulwersator

2
non esiste un documento semplice e unico che spieghi cosa significa il segno +?
Charlie Parker,

Risposte:


740

Le modalità di apertura sono esattamente le stesse della funzione di libreria standard C. fopen() .

La fopenmanpage BSD li definisce come segue:

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.

3
Credo che intendi la chiamata fopen nella libreria standard C (che non è una chiamata di sistema)
Eli Courtwright,

15
NOTA: Python v3 aggiunge una serie di modalità aggiuntive. link alla documentazione
Alex

5
Ho notato che wed w+entrambi possono fareThe file is created if it does not exist
Wei Yang,

4
Su Windows, baggiunto al modo apre il file in modalità binaria, quindi ci sono anche i modi come rb, wbe r+b. Python su Windows fa una distinzione tra file di testo e file binari; i caratteri di fine riga nei file di testo vengono automaticamente modificati leggermente quando i dati vengono letti o scritti.

6
ho ragione a dire che +non fa qualcosa di coerente indipendente se lo è a, wo r? O non riesco a vedere lo schema? Qual è lo schema?
Charlie Parker,

510

Ho notato che ogni tanto ho bisogno che Google ricopra di nuovo da capo, solo per creare un'immagine mentale di quali siano le differenze principali tra le modalità. Quindi, ho pensato che un diagramma sarà più veloce da leggere la prossima volta. Forse anche qualcun altro lo troverà utile.


3
La adescrizione è sbagliata . Le scritture sono sempre posizionate alla fine.
Antti Haapala,

10
@E credo che @Antti si riferisca alla proprietà Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similarche è un po 'più forte del solo dire che la posizione iniziale è la fine.
jcai,

8
@CharlieParker Che ci sono sostanzialmente due operazioni sui file (leggi, scrivi). La modalità r è principalmente per la lettura, le modalità w , a sono principalmente per la scrittura. E il segno più abilita la seconda operazione per una data modalità (detto semplicemente).
Jeyekomon il

22
Per i posteri: troncare significa sovrascrivere dall'inizio.
Minh Tran,

4
@Jeyekomon Il tuo riassunto nel tuo commento qui è probabilmente la cosa più utile che ho letto nel cercare di orientarmi in queste modalità in un modo che ora posso ricordare! Il diagramma di flusso in questa risposta è bellissimo e la tabella nella risposta qui sotto è fantastica, ma se queste risposte (e altre altrove) iniziassero con questo semplice punto e lavorassero da lì, aiuterebbe a fornire un quadro mentale molto migliore per appendere i dettagli su. Quindi grazie. (Sono consapevole che questo è forse al limite dello spamming, ma ho sentito il tuo commento meritato riconoscimento) 💯
Tim

206

Stesse informazioni, solo in forma di tabella

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

dove significati sono: (solo per evitare qualsiasi interpretazione errata)

  • read - la lettura da file è consentita
  • write - è consentita la scrittura su file

  • create: il file viene creato se non esiste ancora

  • troncato - durante l'apertura del file viene reso vuoto (tutto il contenuto del file viene cancellato)

  • posizione all'inizio: dopo l'apertura del file, la posizione iniziale viene impostata all'inizio del file

  • posizione alla fine: dopo l'apertura del file, la posizione iniziale viene impostata alla fine del file

Nota: ae a+aggiungi sempre alla fine del file: ignora eventuali seekmovimenti.
BTW. comportamento interessante almeno sul mio win7 / python2.7, per il nuovo file aperto in a+modalità:
write('aa'); seek(0, 0); read(1); write('b')- il secondo writeviene ignorato
write('aa'); seek(0, 0); read(2); write('b')- il secondo writeaumentaIOError


10
Perché non esiste "Crea file se non esiste. Se esiste, posizionalo all'avvio, abilita lettura e scrittura"? Questo è il caso d'uso più ovvio per me: sto archiviando i dati in un file. Se il file non è presente, crearlo invece di errori. Se ci sono dati nel file che voglio leggere tutto dall'alto, aggiorna alcune cose e riscrivi completamente il file da 0 per la PROSSIMA VOLTA che lo carico. Lo faccio open(file,'a'); close(); open(file,'r+')per fare questo.
spillo

2
Che cosa significa "troncare" in questo contesto?
Charlie Parker,

3
@CharlieParker Significa che tutto il contenuto del file viene cancellato (il file viene reso vuoto)
industryworker3595112

1
Potresti voler aggiungere una nota che con ae le a+scritture accadranno sempre alla fine del file, indipendentemente dal fatto che si sposti manualmente il puntatore usando seek().
balu,

1
Che dire dell'aggiornamento della tabella, per includere 'x' per Python 3?
Nikos Alexandris,

39

Le opzioni sono le stesse della funzione fopen nella libreria standard C:

w tronca il file, sovrascrivendo qualsiasi cosa fosse già lì

a aggiunge al file, aggiungendo a tutto ciò che era già lì

w+ si apre per leggere e scrivere, troncando il file ma consentendo anche di rileggere ciò che è stato scritto nel file

a+ si apre per aggiungere e leggere, consentendo ad entrambi di aggiungere al file e anche di leggerne il contenuto


2
Che cosa significa "troncare" in questo contesto? Significa cancellare i vecchi dati se ne avessero alcuni? O qualcos'altro più specifico?
Charlie Parker,

3
@CharlieParker: Corretto: significa che tutti i dati nel file esistente verranno eliminati e inizieremo a scrivere dall'inizio di un file ora vuoto.
Eli Courtwright,

9

Penso che questo sia importante da considerare per l'esecuzione multipiattaforma, cioè come un CYA. :)

Su Windows, "b" aggiunto alla modalità apre il file in modalità binaria, quindi esistono anche modalità come "rb", "wb" e "r + b". Python su Windows fa una distinzione tra file di testo e file binari; i caratteri di fine riga nei file di testo vengono automaticamente modificati leggermente quando i dati vengono letti o scritti. Questa modifica dietro le quinte dei dati dei file va bene per i file di testo ASCII, ma corromperà i dati binari come quelli nei file JPEG o EXE. Prestare molta attenzione all'utilizzo della modalità binaria durante la lettura e la scrittura di tali file. Su Unix, non fa male aggiungere una "b" alla modalità, quindi puoi usarla in modo indipendente dalla piattaforma per tutti i file binari.

Questo è direttamente citato dalla Python Software Foundation 2.7.x .


9

Ho colto questo tentativo di capire perché avresti usato la modalità 'w +' contro 'w'. Alla fine, ho appena fatto alcuni test. Non vedo molto scopo per la modalità 'w +', poiché in entrambi i casi il file viene troncato per cominciare. Tuttavia, con 'w +', puoi leggere dopo aver scritto cercando indietro. Se provassi a leggere con 'w', si genererebbe un IOError. La lettura senza usare la ricerca con la modalità 'w +' non produrrà nulla, poiché il puntatore del file sarà dopo dove hai scritto.

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.