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, was vor ihnen liegt, wird verworfen.
Zitieren der Python-Dokumente füros.path.join
:
Wenn eine Komponente ein absoluter Pfad ist, werden alle vorherigen Komponenten weggeworfen und die Verknüpfung von der absoluten Pfadkomponente fortgesetzt.
Hinweis unter 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. B. r'\foo'
) gefunden wird. Wenn eine Komponente einen Laufwerksbuchstaben enthält, werden alle vorherigen Komponenten weggeworfen und der Laufwerksbuchstabe wird zurückgesetzt. Beachten Sie, dass, da für jedes Laufwerk ein aktuelles Verzeichnis vorhanden ist, dies os.path.join("c:", "foo")
einen Pfad relativ zum aktuellen Verzeichnis auf Laufwerk C:
( c:foo
) darstellt, nicht c:\foo
.
os.path.normpath
, um dieses Ziel zu erreichen.Die Idee von
os.path.join()
ist, Ihr Programm plattformübergreifend zu gestalten (Linux / Windows / etc).Schon ein Schrägstrich ruiniert es.
Es ist also nur sinnvoll, wenn es mit einem Referenzpunkt wie
os.environ['HOME']
oder verwendet wirdos.path.dirname(__file__)
.quelle
os.path.join()
kann in Verbindung mit verwendet werdenos.path.sep
, um einen absoluten und keinen relativen Pfad zu erstellen.quelle
os.path.sep
als erstes Element zum Erstellen eines absoluten Pfades ist besser als jede andere Antwort hier! Der Sinn der Verwendung vonos.path
str-Methoden anstelle grundlegender str-Methoden besteht darin, das Schreiben zu vermeiden/
. Es ist auch großartig, jedes Unterverzeichnis als neues Argument zu verwenden und alle Schrägstriche zu entfernen. Es wäre wahrscheinlich eine gute Idee, mit einem Scheck sicherzustellen,todaystr
der nicht mit einem Schrägstrich beginnt! ;)Verwenden Sie keine Schrägstriche am Anfang von Pfadkomponenten, außer wenn Sie auf das Stammverzeichnis verweisen:
Siehe auch: http://docs.python.org/library/os.path.html#os.path.join
quelle
Um zu verstehen, warum dieses überraschende Verhalten nicht ganz schrecklich ist, betrachten Sie eine Anwendung, die einen Konfigurationsdateinamen als Argument akzeptiert:
Wenn die Anwendung ausgeführt wird mit:
Die Konfigurationsdatei
/etc/myapp.conf/foo.conf
wird verwendet.Überlegen Sie jedoch, was passiert, wenn die Anwendung aufgerufen wird mit:
Dann
myapp
sollte die Konfigurationsdatei unter/some/path/bar.conf
(und nicht/etc/myapp.conf/some/path/bar.conf
oder ähnlich) verwendet werden.Es mag nicht großartig sein, aber ich glaube, dies ist die Motivation für das absolute Pfadverhalten.
quelle
Dies liegt daran, dass Ihr
'/new_sandbox/'
mit einem beginnt/
und daher relativ zum Stammverzeichnis angenommen wird. Entfernen Sie die Leitung/
.quelle
Um Ihre Funktion portabler zu machen, verwenden Sie sie als solche:
oder
quelle
Versuchen Sie die Kombination von
split("/")
und*
für Zeichenfolgen mit vorhandenen Verknüpfungen.Wie es funktioniert...
split("/")
verwandelt vorhandenen Pfad in Liste:['', 'home', 'build', 'test', 'sandboxes', '']
*
vor der Liste bricht jedes Listenelement seinen eigenen Parameter ausquelle
Versuchen Sie es
new_sandbox
nur mitquelle
Mach es so, ohne die zusätzlichen Schrägstriche
quelle
Beachten Sie, dass ein ähnliches Problem Sie beißen kann, wenn Sie
os.path.join()
eine Erweiterung einfügen, die bereits einen Punkt enthält. Dies geschieht automatisch, wenn Sie diese verwendenos.path.splitext()
. In diesem Beispiel:Auch wenn Sie
extension
möglicherweise.jpg
einen Ordner mit dem Namen "foobar" anstelle einer Datei mit dem Namen "foobar.jpg" haben. Um dies zu verhindern, müssen Sie die Erweiterung separat anhängen:quelle
Sie können
strip
die'/'
:quelle
Ich würde empfehlen, die Zeichenfolge von der zweiten und den folgenden Zeichenfolgen zu entfernen
os.path.sep
, um zu verhindern, dass sie als absolute Pfade interpretiert werden:quelle
eine umfassendere Version:
quelle
"\"
? Dann wird Ihr erstes Beispielos.path.join("a", *"/b".split("\\"))
, das ergibt"/b"
... Ich bezweifle, dass dies das beabsichtigte Ergebnis ist.