Wenn ich das teste, speichert es nur die /new_sandbox/ Teil des Codes.
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.
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
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
Ghammond
os.path.join() kann in Verbindung mit verwendet werden os.path.sep um einen absoluten statt relativen Pfad zu erstellen.
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
miku
Verwenden Sie keine Schrägstriche am Anfang von Pfadkomponenten, außer wenn Sie sich auf das Stammverzeichnis beziehen:
Um zu verstehen, warum dieses überraschende Verhalten nicht so ist völlig Schrecklich, betrachten Sie eine Anwendung, die einen Konfigurationsdateinamen als Argument akzeptiert:
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
Bernstein
Es ist, weil Ihr '/new_sandbox/' beginnt mit a / und wird daher als relativ zum Stammverzeichnis angenommen. Entfernen Sie den führenden /.
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
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
10988000cookie-checkWarum funktioniert os.path.join() in diesem Fall nicht?yes