Was bedeutet "wb" in diesem Code mit Python?


107

Code:

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

Auch sollten Sie in Betracht ziehen, openanstelle von zu verwenden file. filewurde in Python 2 veraltet (konnte nicht finden, welche Version) und wurde in py3k entfernt. (danke Scott) Siehe diese Frage für weitere Informationen.
Luiz Damim

1
Verwenden open stattdessen anstelle von file, was in Python 2 veraltet und in Python 3 entfernt wurde. Siehe stackoverflow.com/questions/112970/…
Max Ghenis

2
Es ist nicht wirklich fair anzunehmen, dass es sich um den eigenen Code des OP handelt, insbesondere angesichts der Art der Frage. Es war offensichtlich einmal gültig.
McKenzm

Antworten:


111

Dateimodus , Schreiben und Binär. Da Sie eine JPG-Datei schreiben, sieht sie gut aus.

Aber wenn Sie diese JPG-Datei lesen sollen, müssen Sie verwenden 'rb'

Mehr Info

Unter Windows öffnet 'b', das an den Modus angehängt ist, die Datei im Binärmodus, daher gibt es auch Modi wie 'rb', 'wb' und 'r + b'. Python unter Windows unterscheidet zwischen Text- und Binärdateien. Die Zeilenendezeichen in Textdateien werden beim Lesen oder Schreiben von Daten automatisch geringfügig geändert. Diese Änderung der Dateidaten hinter den Kulissen ist für ASCII-Textdateien in Ordnung, beschädigt jedoch Binärdaten wie JPEG- oder EXE-Dateien.


4
Konkret fd.write("foo\n")schreibt in Windows für eine im Textmodus geöffnete Datei tatsächlich auf die Festplatte foo\r\n(beachten Sie die \r).
Serge Ballesta

4
Ich bin mir ziemlich sicher, dass 'b' Dateien im Binärmodus auf jeder Plattform öffnet, nicht nur unter Windows, oder es würde auch hier eine enorme Einschränkung geben.
McKenzm

75

Das wbzeigt an, dass die Datei zum Schreiben im Binärmodus geöffnet ist.

Beim Schreiben im Binärmodus nimmt Python keine Änderungen an Daten vor, während diese in die Datei geschrieben werden. Im Textmodus (wenn das bwie gerade ausgeschlossen ist woder wenn Sie den Textmodus mit angeben wt) codiert Python den Text jedoch basierend auf der Standardtextcodierung. Darüber hinaus konvertiert Python die Zeilenenden ( \n) in die plattformspezifischen Zeilenenden, wodurch eine Binärdatei wie ein exeoder beschädigt wirdpng Datei beschädigt wird.

Der Textmodus sollte daher beim Schreiben von Textdateien verwendet werden (ob im Klartext oder in einem textbasierten Format wie CSV), während der Binärmodus beim Schreiben von Nicht-Textdateien wie Bildern verwendet werden muss.

Verweise:

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


1
Dies kann sich im Laufe der Zeit geändert haben. Unter Ubuntu 18.04 mit Python 3.6.8 war der 'Binärmodus' definitiv von Bedeutung. Beim Versuch, in eine Textdatei (CSV-Format, nicht dass es letztendlich so wichtig ist) zu schreiben, die mit der wbOption geöffnet wurde, ist ein Fehler aufgetreten. Durch die Verwendung der wOption konnte ich dafür sorgen, dass sie ordnungsgemäß funktioniert.
TheDavidJohnson

1
Vielen Dank für Ihren Kommentar @TheDavidJohnson. Zurück in Python 2.6 sagten die Dokumente, dass der bModus nur Auswirkungen auf Windows hatte. Das wurde jetzt aus der Dokumentation entfernt und der Binärmodus "sollte für alle Dateien verwendet werden, die keinen Text enthalten".
Daniel G

1
Sicher, @ Daniel! Ich freue mich, dass Sie Ihre Lösung veröffentlichen. Mehr als 9 Jahre später ist es immer noch hilfreich. Wie großartig ist das? Auf jeden Fall wollte ich nur ein paar neue Informationen für andere wie mich hinzufügen, die vielleicht noch mitkommen und dies hilfreich finden. Prost!
TheDavidJohnson

Tolle Erklärung. Eine Klarstellung: Sie sagen "Der Textmodus sollte daher beim Schreiben von Textdateien verwendet werden" . Der Vollständigkeit halber verweise ich auf Ihren früheren Kommentar "Python nimmt keine Änderungen vor [im Binärmodus]" und füge hinzu, dass Sie den Binärmodus für eine Textdatei verwenden würden, wenn Sie die Codierung entweder nicht kennen (oder sich nicht darum kümmern) Sie müssen jedoch nur die Bytes lesen oder schreiben oder die Zeilenenden unabhängig von der Plattform beibehalten.
pcdev

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.