Seite 1 von 1

Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 07:01
von andreaszdw
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

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 07:11
von Francesco
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()))

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 07:30
von Hyperion
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().

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 08:13
von 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'

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 08:27
von snafu
Weiß jemand, welche Intention hinter diesem (übrigens ja auch dokumentierten) Verhalten von `os.path.join()` steckt? Soll das so eine Art `chdir()` sein?

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 09:15
von jbs
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.

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 09:48
von snafu
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:

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 09:59
von jbs
Ja :)

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 10:05
von snafu
jbs hat geschrieben:Ja :)
Danke. :)

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 11:25
von cofi
@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)

Re: Pfad Windows-Linux

Verfasst: Mittwoch 1. September 2010, 11:38
von Barabbas
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

Re: Pfad Windows-Linux

Verfasst: Sonntag 5. September 2010, 10:32
von 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.