Warum funktioniert os.path.join() in diesem Fall nicht?

Lesezeit: 6 Minuten

Benutzer-Avatar
Chrisg

Der folgende Code wird nicht hinzugefügt, wenn der Befehl debuggt wird, speichert er nicht den gesamten Pfad, sondern nur den letzten Eintrag.

os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')

Wenn ich das teste, speichert es nur die /new_sandbox/ Teil des Codes.

Benutzer-Avatar
Craig McQueen

Die letzteren Zeichenfolgen sollten nicht mit einem Schrägstrich beginnen. Wenn sie mit einem Schrägstrich beginnen, werden sie als “absoluter Pfad” betrachtet und alles vor ihnen wird verworfen.

Zitieren der Python-Dokumentation für os.path.join:

Wenn es sich bei einer Komponente um einen absoluten Pfad handelt, werden alle vorherigen Komponenten verworfen und das Verbinden wird von der absoluten Pfadkomponente fortgesetzt.

Hinweis zu Windows, das Verhalten in Bezug auf Laufwerksbuchstaben, das sich im Vergleich zu früheren Python-Versionen geändert zu haben scheint:

Unter Windows wird der Laufwerksbuchstabe nicht zurückgesetzt, wenn eine absolute Pfadkomponente (z. r'\foo') angetroffen wird. Wenn eine Komponente einen Laufwerksbuchstaben enthält, werden alle vorherigen Komponenten verworfen und der Laufwerksbuchstabe zurückgesetzt. Beachten Sie, dass, da es für jedes Laufwerk ein aktuelles Verzeichnis gibt, os.path.join("c:", "foo") stellt einen Pfad relativ zum aktuellen Verzeichnis auf dem Laufwerk dar C: (c:foo), nicht c:\foo.

  • -1: Nein Zeichenfolge sollte ein “/” enthalten. Ein wesentlicher Punkt von os.path.join besteht darin, zu verhindern, dass Schrägstriche in den Pfad eingefügt werden.

    – S. Lott

    22. Dezember 2009 um 12:29 Uhr

  • Das Problem mit str.join() ist natürlich, dass doppelte Schrägstriche nicht beseitigt werden. Ich denke, dies ist der Hauptzweck für Leute, die os.path.join verwenden. zB ‘/’.join([‘/etc/’, ‘/conf’]) ergibt drei Schrägstriche: ‘/etc///conf’

    – Dustin Rasener

    31. Juli 2012 um 14:03 Uhr

  • @DustinRasener Sie können verwenden os.path.normpath um dieses Ziel zu erreichen.

    – Gareth Latty

    28. Oktober 2012 um 17:48 Uhr

  • keine Ahnung, warum die Leute über das Verhalten von os.path.join frustriert sind. In anderen Sprachen verhält sich die äquivalente Path-Join-Bibliothek/-Methode genau gleich. Das ist sicherer und macht mehr Sinn.

    – Don Cheadle

    4. Dezember 2014 um 17:41 Uhr

  • Das ist frustrierend, weil es ist implizite Magieim Gegensatz zu der kardinale Heuristik von “Explizite ist besser als implizit.” Und es ist. Sprachdesigner glauben vielleicht, sie wüssten es besser, aber es gibt offensichtliche und nachweislich sichere Gründe, dies gelegentlich tun zu wollen. Jetzt können wir nicht. Deshalb können wir keine guten Dinge haben.

    – Cecil Curry

    18. August 2015 um 5:54 Uhr

Benutzer-Avatar
Antony Hatchkins

Die Idee von os.path.join() ist es, Ihr Programm plattformübergreifend (Linux/Windows/etc) zu machen.

Sogar ein Schrägstrich ruiniert es.

Es macht also nur Sinn, wenn es mit einer Art Referenzpunkt wie verwendet wird
os.environ['HOME'] oder os.path.dirname(__file__).

  • Der vorangestellte Schrägstrich im relativen Pfad hat es für mich vermasselt … das Entfernen hat es behoben … danke!

    – joeyagreco

    13. November 2021 um 21:28 Uhr

Benutzer-Avatar
Ghammond

os.path.join() kann in Verbindung mit verwendet werden os.path.sep um einen absoluten statt relativen Pfad zu erstellen.

os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox')

  • Die Verwendung von os.path.sep Als erstes Element zum Erstellen eines absoluten Pfads ist dies besser als jede andere Antwort hier! Der ganze Sinn der Verwendung os.path anstelle von einfachen str-Methoden ist es, das Schreiben zu vermeiden /. Es ist auch großartig, jedes Unterverzeichnis als neues Argument zu setzen und alle Schrägstriche zu entfernen. Es wäre wahrscheinlich eine gute Idee, dies mit einem Check sicherzustellen todaystr beginnt nicht mit einem Schrägstrich! 😉

    – snooze92

    23. Januar 2014 um 8:59 Uhr


  • Dies funktioniert auch unter Windows (Python 2.7.6). Es störte ‘C:\’ nicht und trat den Unterverzeichnissen bei.

    – rickfoosusa

    2. Februar 2015 um 21:22 Uhr

  • @ snooze92 Das einzige Problem ist, dass es ausführlicher und viel weniger lesbar ist.

    – jugr

    14. Januar um 3:00 Uhr

  • In der Tat. Kompromisse, denke ich 😉

    – snooze92

    14. Januar um 14:26 Uhr

Benutzer-Avatar
miku

Verwenden Sie keine Schrägstriche am Anfang von Pfadkomponenten, außer wenn Sie sich auf das Stammverzeichnis beziehen:

os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')

siehe auch: http://docs.python.org/library/os.path.html#os.path.join

Um zu verstehen, warum dieses überraschende Verhalten nicht so ist völlig Schrecklich, betrachten Sie eine Anwendung, die einen Konfigurationsdateinamen als Argument akzeptiert:

config_root = "/etc/myapp.conf/"
file_name = os.path.join(config_root, sys.argv[1])

Wenn die Anwendung ausgeführt wird mit:

$ myapp foo.conf

Die Konfigurationsdatei /etc/myapp.conf/foo.conf wird verwendet.

Aber bedenken Sie, was passiert, wenn die Anwendung aufgerufen wird mit:

$ myapp /some/path/bar.conf

Dann myapp sollte Verwenden Sie die Konfigurationsdatei unter /some/path/bar.conf (und nicht /etc/myapp.conf/some/path/bar.conf oder ähnliches).

Es mag nicht großartig sein, aber ich glaube, dass dies die Motivation für das absolute Pfadverhalten ist.

  • Vielen Dank! Ich hatte dieses Verhalten immer gehasst, bis ich Ihre Antwort gelesen habe! Es ist dokumentiert in docs.python.org/3.5/library/os.path.html#os.path.joinaber nicht die Motivation dafür.

    – Eli_B

    7. September 2017 um 11:59 Uhr


  • Dieser Moment, in dem Sie genau die Lösung brauchen, die viele Menschen für schrecklich halten.

    – Ashrasmun

    4. September 2019 um 20:33 Uhr

  • Ich muss dir widersprechen, es ist völlig schrecklich. In diesem Fall sollten Sie nicht naiv sein sys.argv Eingabe, um zu bestimmen, ob dem vorangestellt werden soll config_root oder nicht. Alle os.path.join sollte sich mit dem Zusammenfügen von Dateipfadelementen befassen.

    – Benutzer5359531

    1. September 2020 um 20:53 Uhr

  • Das Problem ist, dass der Name schlecht gewählt ist. was os.path.join(p1, p2) tut nicht wirklich beitreten p1 und p2es dauert p2 relativ zu p1 (oder unbedingt wenn p2 ist ein absoluter Pfad)

    – Nephant

    17. Mai 2021 um 8:12 Uhr

  • Ein bestimmter Anwendungsfall soll also bestimmen, wie sich eine Funktion für alle anderen Anwendungsfälle verhält? Macht keinen Sinn.

    – Gülzar

    8. November 2021 um 8:39 Uhr

Benutzer-Avatar
Bernstein

Es ist, weil Ihr '/new_sandbox/' beginnt mit a / und wird daher als relativ zum Stammverzeichnis angenommen. Entfernen Sie den führenden /.

  • Vielen Dank! Ich hatte dieses Verhalten immer gehasst, bis ich Ihre Antwort gelesen habe! Es ist dokumentiert in docs.python.org/3.5/library/os.path.html#os.path.joinaber nicht die Motivation dafür.

    – Eli_B

    7. September 2017 um 11:59 Uhr


  • Dieser Moment, in dem Sie genau die Lösung brauchen, die viele Menschen für schrecklich halten.

    – Ashrasmun

    4. September 2019 um 20:33 Uhr

  • Ich muss dir widersprechen, es ist völlig schrecklich. In diesem Fall sollten Sie nicht naiv sein sys.argv Eingabe, um zu bestimmen, ob dem vorangestellt werden soll config_root oder nicht. Alle os.path.join sollte sich mit dem Zusammenfügen von Dateipfadelementen befassen.

    – Benutzer5359531

    1. September 2020 um 20:53 Uhr

  • Das Problem ist, dass der Name schlecht gewählt ist. was os.path.join(p1, p2) tut nicht wirklich beitreten p1 und p2es dauert p2 relativ zu p1 (oder unbedingt wenn p2 ist ein absoluter Pfad)

    – Nephant

    17. Mai 2021 um 8:12 Uhr

  • Ein bestimmter Anwendungsfall soll also bestimmen, wie sich eine Funktion für alle anderen Anwendungsfälle verhält? Macht keinen Sinn.

    – Gülzar

    8. November 2021 um 8:39 Uhr

Benutzer-Avatar
offen

Probieren Sie eine Kombination aus split("https://stackoverflow.com/") und * für Strings mit bestehenden Joins.

import os

home="/home/build/test/sandboxes/"
todaystr="042118"
new = '/new_sandbox/'

os.path.join(*home.split("https://stackoverflow.com/"), todaystr, *new.split("https://stackoverflow.com/"))

Wie es funktioniert…

split("https://stackoverflow.com/") wandelt bestehenden Pfad in Liste um: ['', 'home', 'build', 'test', 'sandboxes', '']

* Vor der Liste bricht jeder Listeneintrag seinen eigenen Parameter ab

  • Dadurch wird es zu einem relativen Pfad und nicht zu einem absoluten Pfad

    – Benutzer5359531

    1. September 2020 um 21:00 Uhr

  • Perfekt für die Arbeit mit Endpunkten mit führenden Schrägstrichen. Vielen Dank!

    – Wyrmholz

    13. April um 3:02

1098800cookie-checkWarum funktioniert os.path.join() in diesem Fall nicht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy