Confuso dalla modalità file python “w +”


201

Dal documento ,

Le modalità 'r +', 'w +' e 'a +' aprono il file per l'aggiornamento (si noti che 'w +' tronca il file). Aggiungi 'b' alla modalità per aprire il file in modalità binaria, su sistemi che differenziano tra file binari e di testo; su sistemi che non hanno questa distinzione, l'aggiunta di 'b' non ha alcun effetto.

e qui

w +: apre un file sia per la scrittura che per la lettura. Sovrascrive il file esistente se il file esiste. Se il file non esiste, crea un nuovo file per la lettura e la scrittura.

Ma come leggere un file aperto con w+?


27
Ho trovato questo diagramma abbastanza utile.
Ritwik,

Risposte:


132

Diciamo che stai aprendo il file con una withdichiarazione come dovresti essere. Quindi faresti qualcosa del genere per leggere dal tuo file:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

Nota f.seek(0): se lo dimentichi, la f.read()chiamata proverà a leggere dalla fine del file e restituirà una stringa vuota.


1
che cosa significa "troncamento a 0 byte"?
Nasif Imtiaz Ohi,

22
@NasifImtiazOhi - I documenti di Python dicono che w+"sovrascriveranno il file esistente se il file esiste". Quindi non appena si apre un file con w+, ora è un file vuoto: contiene 0 byte. Se usato per contenere i dati, quei dati sono stati troncati - tagliati e eliminati - e ora la dimensione del file è di 0 byte, quindi non è possibile leggere nessuno dei dati esistenti prima di aprire il file w+. Se davvero volevi leggere i dati precedenti e aggiungerli, dovresti usare r+invece di w+.
rmunn,

come aggiungere nuovi dati in cima?
Beqa Bukhradze,

1
@BeqaBukhradze - Se hai una domanda, fai clic sul pulsante "Poni una domanda", dove verrà visualizzato da centinaia di persone. Non fare semplicemente clic sul pulsante "Aggiungi commento" dove solo una o due persone lo vedranno.
rmunn,

431

Ecco un elenco delle diverse modalità di apertura di un file:

  • r

    Apre un file per sola lettura. Il puntatore del file si trova all'inizio del file. Questa è la modalità di default.

  • rb

    Apre un file per la lettura solo in formato binario. Il puntatore del file si trova all'inizio del file. Questa è la modalità di default.

  • r +

    Apre un file sia per la lettura che per la scrittura. Il puntatore del file sarà all'inizio del file.

  • rb +

    Apre un file per la lettura e la scrittura in formato binario. Il puntatore del file sarà all'inizio del file.

  • w

    Apre un file solo per la scrittura. Sovrascrive il file se il file esiste. Se il file non esiste, crea un nuovo file per la scrittura.

  • wb

    Apre un file per la scrittura solo in formato binario. Sovrascrive il file se il file esiste. Se il file non esiste, crea un nuovo file per la scrittura.

  • w +

    Apre un file sia per la scrittura che per la lettura. Sovrascrive il file esistente se il file esiste. Se il file non esiste, crea un nuovo file per la lettura e la scrittura.

  • wb +

    Apre un file per la scrittura e la lettura in formato binario. Sovrascrive il file esistente se il file esiste. Se il file non esiste, crea un nuovo file per la lettura e la scrittura.

  • un'

    Apre un file per l'aggiunta. Il puntatore del file si trova alla fine del file se il file esiste. Cioè, il file è in modalità append. Se il file non esiste, crea un nuovo file per la scrittura.

  • ab

    Apre un file per l'aggiunta in formato binario. Il puntatore del file si trova alla fine del file se il file esiste. Cioè, il file è in modalità append. Se il file non esiste, crea un nuovo file per la scrittura.

  • un +

    Apre un file sia per l'aggiunta che per la lettura. Il puntatore del file si trova alla fine del file se il file esiste. Il file si apre in modalità append. Se il file non esiste, crea un nuovo file per la lettura e la scrittura.

  • ab +

    Apre un file per aggiungere e leggere in formato binario. Il puntatore del file si trova alla fine del file se il file esiste. Il file si apre in modalità append. Se il file non esiste, crea un nuovo file per la lettura e la scrittura.


quindi per tutti gli scopi intensivi, r + e w + sono uguali?
Nick Humrich,

21
@Humdinger: No, w+crea un nuovo file o tronca un file esistente, quindi lo apre per la lettura e la scrittura; r+apre un file esistente senza troncarlo per la lettura e la scrittura. Molto diverso.
Abarnert

Inoltre, come nella risposta di @ AlokAgarwal, questo afferma di essere un elenco esaustivo di modalità, ma non lo è.
Abarnert

1
Sarebbe piuttosto sciocco dare un elenco esaustivo di modalità, poiché funzionano più come una funzione con più parametri. r, wo asono esclusivi, ma bpossono essere aggiunti a qualsiasi di quelli, come può +, o U... È un'esplosione combinatoria.
rmunn,

4
rbnon è la modalità predefinita, citazione: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open~~V~~singular~~3rd
Iggy

158

Tutte le modalità di file in Python

  • r per leggere
  • r+ si apre per la lettura e la scrittura (impossibile troncare un file)
  • w per scrivere
  • w+ per scrivere e leggere (può troncare un file)
  • rbper leggere un file binario. Il puntatore del file si trova all'inizio del file.
  • rb+ leggere o scrivere un file binario
  • wb+ scrivere un file binario
  • a+ si apre per l'aggiunta
  • ab+Apre un file per aggiungere e leggere in binario. Il puntatore del file si trova alla fine del file se il file esiste. Il file si apre in modalità append.
  • x aperto per creazione esclusiva, non riuscita se il file esiste già (Python 3)

5
Questa non è tutte le modalità. Trascura, ad esempio, rbe wb, per non parlare delle Umodalità in 2.xe della tmodalità in 3.x (che possono essere entrambe combinate con tutto tranne che b).
Abarnert

1
La differenza tra r + e w + è che w + tronca un file quando viene aperto. Ma puoi troncarlo manualmente in entrambe le modalità.
Martin,

1
Questa risposta non è coerente con quella data da @ 200 OK, ad esempio wb+legge anche dal file?
Celeritas,

@Celeritas Il wb indica che il file è aperto per la scrittura in modalità binaria. Sui sistemi Unix (Linux, Mac OS X, ecc.), La modalità binaria non fa nulla: tratta i file di testo nello stesso modo in cui vengono trattati tutti gli altri file. Su Windows, tuttavia, i file di testo vengono scritti con terminazioni di riga leggermente modificate. Ciò causa un grave problema quando si tratta di file binari reali, come file exe o jpg. Pertanto, quando si aprono file che non dovrebbero essere di testo, anche in Unix, è necessario utilizzare wb o rb. Usa pianura solo per file di testo.
Alok Agarwal,

In Python 3 esiste anche la modalità aperta 'x': aperta per la creazione esclusiva, non riuscita se il file esiste già. Vedi la funzione aperta nel documento.
Laurent LAPORTE,

9

r per leggere

w per scrivere

r+ per leggere / scrivere senza eliminare il contenuto originale se il file esiste, altrimenti sollevare un'eccezione

w+ per eliminare il contenuto originale quindi leggere / scrivere se il file esiste, altrimenti creare il file

Per esempio,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'
>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$

2

Il file viene troncato, quindi puoi chiamare read()(senza eccezioni sollevate, a differenza dell'apertura usando 'w') ma otterrai una stringa vuota.


2

Sospetto che ci siano due modi per gestire ciò che penso tu stia cercando di ottenere.

1) il che è ovvio, è aprire il file in sola lettura, leggerlo in memoria, quindi aprire il file con t, quindi scrivere le modifiche.

2) utilizzare le routine di gestione dei file di basso livello:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

Spero che questo ti aiuti..


Allora che cosa per r+
SmartManoj

1

In realtà, c'è qualcosa di sbagliato in tutte le altre risposte r+ modalità.

test.in contenuto del file :

hello1
ok2
byebye3

E la sceneggiatura di Py:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Eseguilo e il test.incontenuto sarà cambiato in:

hello1
ok2
byebye3
addition

Tuttavia, quando modifichiamo lo script in:

with open("test.in", 'r+')as f:
    f.write("addition")

il test.inanche fare il rispondono:

additionk2
byebye3

Quindi, la r+modalità ci permetterà di coprire il contenuto dall'inizio se non avessimo eseguito l'operazione di lettura. E se facciamo qualche operazione di lettura,f.write() accediamo al file.

A proposito, se lo facessimo f.seek(0,0)prima f.write(write_content), il write_content li coprirà dal positon (0,0).


0

Come accennato da h4z3 , Per un uso pratico, a volte i tuoi dati sono troppo grandi per caricare direttamente tutto, oppure hai un generatore o dati in entrata in tempo reale, puoi usare w + per archiviare in un file e leggere in seguito.

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.