Pfad Windows-Linux

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
andreaszdw
User
Beiträge: 24
Registriert: Donnerstag 12. Oktober 2006, 07:28

Hallo,

mit dieser Zeile:

Code: Alles auswählen

pathdir = '%s\%s' % (os.getcwd() , self.GetItemText(self.GetFocusedItem()))
erstelle ich einen Pfad. Mit dem Trennzeichen "\" funktioniert es unter Windows, das ich den neuen Pfad zum Verzeichniswechsel benutzen kann. Unter Linux klappt es nicht. Da muss ich als Trennzeichen "/" benutzen. Wie kriege ich das hin, das unter Linux oder Windows der jeweils richtige Trenner genommen wird?

Andreas
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

andreaszdw hat geschrieben:Hallo,

mit dieser Zeile:

Code: Alles auswählen

pathdir = '%s\%s' % (os.getcwd() , self.GetItemText(self.GetFocusedItem()))
erstelle ich einen Pfad. Mit dem Trennzeichen "\" funktioniert es unter Windows, das ich den neuen Pfad zum Verzeichniswechsel benutzen kann. Unter Linux klappt es nicht. Da muss ich als Trennzeichen "/" benutzen. Wie kriege ich das hin, das unter Linux oder Windows der jeweils richtige Trenner genommen wird?

Andreas
Dafür hat Python os.path.join vorgesehen

Code: Alles auswählen

pathdir = os.path.join(os.getcwd(), self.GetItemText(self.GetFocusedItem()))
oder du holst dir den separator os.sep

Code: Alles auswählen

pathdir = '%s%s%s' % (os.getcwd(), os.sep, self.GetItemText(self.GetFocusedItem()))
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Francesco hat geschrieben: oder du holst dir den separator os.sep

Code: Alles auswählen

pathdir = '%s%s%s' % (os.getcwd(), os.sep, self.GetItemText(self.GetFocusedItem()))
Die erste Idee war die bessere ;-)

Zudem ist die String Formatierung mittels "%" in gewisser Weise "deprecated" (Bezüglich der Aufwärtskompatibilität zu Python 3). Ich würde bei neuem > 2.5er Code immer auf "".format() setzen.

Aber Für das Zusammensetzen gibt es nun einmal oben vorgestelltes join().
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Es gibt auch durchaus handfeste praktische Unterschiede zwischen den beiden Varianten, über die man sich klar sein sollte:

Code: Alles auswählen

In [483]: '%s%s%s' % ('foo/', os.path.sep, '/bar')
Out[483]: 'foo///bar'

In [484]: os.path.join('foo/', '/bar')
Out[484]: '/bar'
Benutzeravatar
snafu
User
Beiträge: 6854
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Weiß jemand, welche Intention hinter diesem (übrigens ja auch dokumentierten) Verhalten von `os.path.join()` steckt? Soll das so eine Art `chdir()` sein?
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Vielleicht hilft es zur Verständnis, wenn wir es auf Windows übertragen:

Code: Alles auswählen

>>> os.path.join('images\\', r'C:\foo')
'C:\\foo'

os.path.join unterscheidet zwischen relativen und absoluten Pfaden.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
snafu
User
Beiträge: 6854
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich habe schon verstanden, dass die Funktion absolute Pfade den relativen vorzieht. Daher verwies ich auf die Dokumentation:
If any component is an absolute path, all previous components (on Windows, including the previous drive letter, if there was one) are thrown away, and joining continues.
Was ich mich frage, ist warum das so gemacht wird. Das erinnert mich, wie schon angesprochen, gewissermaßen an ein simuliertes Verzeichniswechseln. Quasi das Endresultat, das bei einer Folge von `chdir()`-Aufrufen herauskommen würde.

Übrigens sehe ich nicht, was an deinem Windows-Beispiel soviel verständlicher im Hinblick auf die Frage ist. Wolltest du mir jetzt etwa verdeutlichen, was eine absolute Pfadangabe ist? :lol:
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Ja :)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
snafu
User
Beiträge: 6854
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

jbs hat geschrieben:Ja :)
Danke. :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@snafu: Welche andere Verknuepfung von einem Pfad mit einem absoluten Pfad faendest du denn sinnvoll?
`os.path.join` verknuepft beliebig viele Pfadkomponenten und dabei macht es durchaus Sinn absolute Pfade eben nicht auf andere zu stoepseln. Das will schon richtig benutzt werden.

.NET macht es genauso, bei Java fand ich kein direktes Aequivalent (und war zu faul zu testen ob sich der `File`-Constructor genauso verhaelt)
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Naja, ich hätte - vor Lesen der Doc - erwartet, dass "image" mit "c:\\test" gejoint eine Exception wirft - eben weil ein gültiger Pfad in dieser Reihenfolge nicht möglich ist. Aber offensichtlich hat join() noch einen ganz anderen Anspruch.

Schönen Gruß,

brb
lunar

Absolute Pfade stehen ja selten im Programmtext, sondern kommen fast immer aus externen Quellen, und da entspricht das Verhalten von "os.path.join" dem Verhalten, was man bei Pfaden intuitiv erwartet, nämlich das absolute Pfade eben absolut sind. Würde "os.path.join" in diesem Fall eine Ausnahme auslösen, dann müsste man diese immer abfangen und absolute Pfade besonders behandeln. Das wäre nicht sonderlich komfortabel.
Antworten