invalid mode ('rb') or filename

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

huhu!


Nach langer Zeit habe ich heute mal wieder Python rausgekramt und ich komm einfach nicht klar.
Ich erinnere mich, mit Pfaden schon früher Probleme gehabt zu haben, doch kann ich mich an die Lösung nicht erninnern.

Code: Alles auswählen

from PIL import Image

img = Image.open('E:\Dokumente und Einstellungen\blub\Desktop\abc.bmp')
Fehlermeldung:
IOError: [Errno 22] invalid mode ('rb') or filename: 'E:\\Dokumente und Einstellungen\\blub\\Desktop\x07bc.bmp'

Wieso sind da Doppelschrägstriche?
Wieso wandelt der das "a" in "x07" um?
Wieso taucht "invalid mode ('rb') or filename:" auf?


Gruß
Paul
lunar

In Zeichenkettenliteralen markiert der umgekehrte Schrägstrich besondere Zeichen, lies dazu die Dokumentation.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Peak_me hat geschrieben:

Code: Alles auswählen

from PIL import Image

img = Image.open('E:\Dokumente und Einstellungen\blub\Desktop\abc.bmp')
Fehlermeldung:
IOError: [Errno 22] invalid mode ('rb') or filename: 'E:\\Dokumente und Einstellungen\\blub\\Desktop\x07bc.bmp'

Wieso sind da Doppelschrägstriche?
Wieso wandelt der das "a" in "x07" um?
Wieso taucht "invalid mode ('rb') or filename:" auf?
1: Das ist die Darstellung eines einzelnen Backslashs.
2: Ein Backslash leitet eine Escape-Sequenz ein.
3: Weil der Dateiname falsch ist.

Falls es nicht schon klar geworden ist möchte ich hier noch mal die Ursache aufklären. Ein Backslash alleine ist erst einmal ein Nichts und erlangt erst im Zusammenspiel mit dem dahinter stehenden Zeichen eine Bedeutung. "\t" steht zum Beispiel für einen Tabulator, "\n" für einen Zeilenumbruch. Es gibt natürlich auch Zeichen, die im Zusammenhang mit einem Backslash keine Bedeutung haben und dann bleibt der Backslash erhalten. Folgende Lösungen bieten sich jetzt für das Problem an.
  • Im String den Backslash durch einen Backslash escapen, also nicht "c:\temp", sondern "c:\\temp"
  • Mit Raw-Strings arbeiten wo der Escape-Mechanismus deaktiviert ist: r"c:\temp"
Den Code oben würde ich übrigens wie folgt ausdrücken:

Code: Alles auswählen

filename = os.path.join(os.path.expanduser("~"), "Desktop", "abc.bmp")
img = Image.open(filename)
Peak_me
User
Beiträge: 92
Registriert: Sonntag 27. Januar 2008, 03:09

vielen Dank!

das
Falls es nicht schon klar geworden ist möchte ich hier noch mal die Ursache aufklären. Ein Backslash alleine ist erst einmal ein Nichts und erlangt erst im Zusammenspiel mit dem dahinter stehenden Zeichen eine Bedeutung. "\t" steht zum Beispiel für einen Tabulator, "\n" für einen Zeilenumbruch. Es gibt natürlich auch Zeichen, die im Zusammenhang mit einem Backslash keine Bedeutung haben und dann bleibt der Backslash erhalten. Folgende Lösungen bieten sich jetzt für das Problem an.

* Im String den Backslash durch einen Backslash escapen, also nicht "c:\temp", sondern "c:\\temp"
* Mit Raw-Strings arbeiten wo der Escape-Mechanismus deaktiviert ist: r"c:\temp"
hat mir sehr weitergeholfen!
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn ich nicht mich nicht gerad völlig irre kannst du mit Python unter Windows auch den Slash / anstat dem Backslash \ nehmen. Dann hast du auch kein Problem mit dem Maskieren. :-)

Gruß, noisefloor
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

noisefloor hat geschrieben:wenn ich nicht mich nicht gerad völlig irre kannst du mit Python unter Windows auch den Slash / anstat dem Backslash \ nehmen. Dann hast du auch kein Problem mit dem Maskieren. :-)
Man kann sich darauf verlassen, dass es vielleicht funktioniert. Es spricht aber wirklich nichts dagegen, es mit os.path.join() direkt richtig zu machen.
Benutzeravatar
noisefloor
User
Beiträge: 3854
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Es spricht aber wirklich nichts dagegen, es mit os.path.join() direkt richtig zu machen.
Nein, natürlich nicht. Das os.path.join(9 ist sicherlich die sauberste Lösung. :-)

Gruß, noisefloor
Antworten