Cosa significa "wb" in questo codice, usando Python?


107

Codice:

file('pinax/media/a.jpg', 'wb')

Inoltre dovresti considerare l'utilizzo al openposto di file. fileera deprecato in Python 2 (impossibile trovare quale versione) ed è stato rimosso in py3k. (grazie Scott) Vedi questa domanda per maggiori informazioni.
Luiz Damim

1
L'uso openinvece di file, che è stato deprecato in Python 2 e rimosso in Python 3. Vedere stackoverflow.com/questions/112970/...
Max Ghenis

2
Non è davvero giusto presumere che sia il codice dell'OP, soprattutto data la natura della domanda. Ovviamente era valido in una sola volta.
mckenzm

Risposte:


112

Modalità file , scrittura e binario. Dato che stai scrivendo un file .jpg, sembra a posto.

Ma se dovessi leggere quel file jpg devi usare 'rb'

Ulteriori informazioni

Su Windows, "b" aggiunto alla modalità apre il file in modalità binaria, quindi ci sono 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 leggermente modificati automaticamente quando i dati vengono letti o scritti. Questa modifica dietro le quinte ai dati del file va bene per i file di testo ASCII, ma corromperà i dati binari come quelli nei file JPEG o EXE.


4
In concreto, in Windows per un file aperto in modalità testo, fd.write("foo\n")scrive effettivamente su disco foo\r\n(notare il \r).
Serge Ballesta

4
Sono abbastanza sicuro che "b" apra i file in modalità binaria su ogni piattaforma, non solo su Windows o ci sarebbe anche un enorme avvertimento qui.
mckenzm

76

Il wbindica che il file è aperto per la scrittura in modalità binaria.

Quando si scrive in modalità binaria, Python non apporta modifiche ai dati mentre vengono scritti nel file. In modalità testo (quando bè escluso come in just wo quando si specifica la modalità testo con wt), tuttavia, Python codificherà il testo in base alla codifica di testo predefinita. Inoltre, Python convertirà le terminazioni di riga ( \n) in qualunque sia la fine di riga specifica della piattaforma, il che corromperà un file binario come un file exeo png.

La modalità testo dovrebbe quindi essere utilizzata quando si scrivono file di testo (sia che si utilizzi testo normale o un formato basato su testo come CSV), mentre la modalità binaria deve essere utilizzata quando si scrivono file non di testo come immagini.

Riferimenti:

https://docs.python.org/3/tutorial/inputoutput.html#reading-and-writing-files https://docs.python.org/3/library/functions.html#open


1
Questo potrebbe essere cambiato nel tempo. Su Ubuntu 18.04 con Python 3.6.8, la "modalità binaria" era decisamente importante. Ho ricevuto un errore durante il tentativo di scrivere su un file di testo (formato CSV, non che alla fine sia così importante) che è stato aperto con l' wbopzione. Utilizzando winvece l' opzione, sono stato in grado di farlo funzionare correttamente.
TheDavidJohnson

1
Grazie per il tuo commento @TheDavidJohnson. Tornando a Python 2.6, i documenti dicevano che la bmodalità aveva effetto solo su Windows. Ora è stato rimosso dalla documentazione e la modalità binaria "dovrebbe essere utilizzata per tutti i file che non contengono testo".
Daniel G

1
Certo, @Daniel! Apprezzo che tu abbia pubblicato la tua soluzione. Più di 9 anni dopo, è ancora utile. Quanto è fantastico? In ogni caso, volevo solo aggiungere alcune nuove informazioni per altri come me che potrebbero ancora venire e trovare questo utile. Saluti!
TheDavidJohnson

Ottima spiegazione. Una precisazione, tuttavia: dici "La modalità testo dovrebbe quindi essere utilizzata quando si scrivono file di testo" . Per completezza fare riferimento al tuo commento precedente che "Python non apporta modifiche [in modalità binaria]" e aggiungerei che useresti la modalità binaria su un file di testo quando non sai (o non ti interessa) quale sia la codifica ma devi solo leggere o scrivere i byte, o se vuoi mantenere le terminazioni di riga indipendentemente dalla piattaforma.
pcdev

8

Questa è la modalità con cui stai aprendo il file. "wb" significa che stai scrivendo nel file (w) e che stai scrivendo in modalità binaria (b).

Controlla la documentazione per ulteriori informazioni: cliccabile

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.