os.path.join vs. os.sep.join

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
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Gibts da grundlegende Unterschiede zwischen den beiden Methoden Pfadeteile zu verbinden?
Das einzige was mir aufgefallen ist, dass erstere fünf Mal langsamer ist und eben den Typ der Übergabe, variable Parameterlänge vs. Liste.
Ansonsten scheinen die stets die gleiche Ausgabe zu produzieren.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@darktrym: »os.sep« ist ein String, der üblicherweise das Zeichen enthält, das das verwendete Betriebssystem zum Trennen von Verzeichnissen vorgesehen hat. »os.path.join« ist eine Funktion, die nach den Regeln des verwendeten Betriebssystems Pfade aneinanderhängt und dabei die Besonderheiten des jeweiligen Systems berücksichtigt (Absolute vs. relative Pfade, Laufwerksbuchstaben, etc.). Wenn bei Dir da immer das selbe herauskommt, hast Du nicht alle Fälle unter allen Betriebssystemen getestet.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Wenn die Möglichkeit besteht könntest du auf Python 3.4 aufrüsten und mit "pathlib" arbeiten.
Wie gerade entdeckt steht https://pypi.python.org/pypi/pathlib/ auch für weitere Python Versionen zur Verfügung.
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Sirius3 hat geschrieben:@darktrym: »os.sep« ist ein String, der üblicherweise das Zeichen enthält, das das verwendete Betriebssystem zum Trennen von Verzeichnissen vorgesehen hat. »os.path.join« ist eine Funktion, die nach den Regeln des verwendeten Betriebssystems Pfade aneinanderhängt und dabei die Besonderheiten des jeweiligen Systems berücksichtigt (Absolute vs. relative Pfade, Laufwerksbuchstaben, etc.). Wenn bei Dir da immer das selbe herauskommt, hast Du nicht alle Fälle unter allen Betriebssystemen getestet.
Ok, unter Windows wäre das ein Problem. Aber da verhält sich os.path.join ohnehin nicht wesentlich korrekter. Wenn ich bspw. zwei absolute Pfade verbinde dürfte jedenfalls kein Ergebnis rauskommen weil's nicht eindeutig ist. Mir gibt er dann immer den letzten absoluten zurück.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Warum wäre das nicht eindeutig? Und was hat das mit Windows zu tun? Die Funktion verhält sich auch unter Linux so. Ich hätte ohne das Ergebnis zu kennen dabei auch den zweiten absoluten Pfad als Ergebnis erwartet. Ich fasse das so auf: Hier sind zwei Pfade, wenn ich erst dem einen, und dann dem anderen folge, lande ich irgendwo. Und von `path.join()` erwarte ich als Ergebnis *einen* Pfad dem ich folgen kann und genau an der gleichen Stelle lande.

Ausserdem ist das Verhalten eindeutig so dokumentiert: „If any component is an absolute path, all previous path components will be discarded.”
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Wenn ich Pfadteile ihm übergebe erwarte ich eigentlich: Entweder fügt man diese zusammen oder gibt eine Exception aus wenn's gar nicht möglich/sinnvoll ist. Mir irgendeinen zu präsentieren, auch wenn das in der Doku vermerkt ist welcher es immer ist, ist gelinde gesagt reichlich sinnfrei. Gott bewahre dass es keine Software da draußen gibt, wo Eve zwei Parameter manipulieren kann.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Es wird nicht *irgendeiner* präsentiert sondern der der *sinnvoll* ist. Warum habe ich schon beschrieben. Es sollte der Pfad beschrieben werden, bei dem man landet wenn man die Pfade nacheinander abläuft. Und wenn einer von den Pfaden ein absoluter Pfad ist, dann bedeutet das, dass man an der Stelle wieder beim Wurzelverzeichnis anfängt. Folgendes sollte den gleichen Zustand liefern, und zwar auch wenn `path_b` ein absoluter Pfad ist:

Code: Alles auswählen

os.chdir(path_a)
print os.path.mtime(path_b)

# <=>

print os.path.mtime(os.path.join(path_a, path_b))
Das mit Eve habe ich nicht so ganz verstanden, es sei denn Du erwartest auch das `os.path.join()` so etwas wie '/../' * 20 in relativen Pfaden verbietet. Nur damit Du davon nicht überrascht wirst: Man kann in den Pfaden auch relativ „nach oben” wandern.
Antworten