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.
os.path.join vs. os.sep.join
@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.
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.
Wie gerade entdeckt steht https://pypi.python.org/pypi/pathlib/ auch für weitere Python Versionen zur Verfügung.
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.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.
-
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.”
Ausserdem ist das Verhalten eindeutig so dokumentiert: „If any component is an absolute path, all previous path components will be discarded.”
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.
-
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:
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.
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))