Bei einem Pfad wie z "mydir/myfile.txt"
, wie finde ich den absoluten Pfad der Datei in Python? Unter Windows könnte ich beispielsweise Folgendes erhalten:
"C:/example/cwd/mydir/myfile.txt"
izb
Bei einem Pfad wie z "mydir/myfile.txt"
, wie finde ich den absoluten Pfad der Datei in Python? Unter Windows könnte ich beispielsweise Folgendes erhalten:
"C:/example/cwd/mydir/myfile.txt"
Sherbang
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Funktioniert auch, wenn es bereits ein absoluter Pfad ist:
>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'
Hinweis: Auf den meisten Plattformen entspricht dies dem Aufruf der Funktion normpath()
folgendermaßen: normpath(join(os.getcwd(), path))
. Also wenn mydir/myfile.txt
nicht unter os.getcwd()
der absolute Pfad ist nicht der wahre Weg.
– coanor
25. November 2014 um 4:15 Uhr
@coanor? Ohne eine explizite Wurzel, mydir/myfile.txt
verweist implizit auf einen Pfad innerhalb des aktuellen Arbeitsverzeichnisses und ist daher äquivalent zu ./mydir/myfile.txt
. Das ist vielleicht nicht der Pfad, den Sie eingeben wollten, aber es scheint die korrekte Interpretation des Pfads zu sein, soweit ich das beurteilen kann. Könnten Sie das näher erläutern?
– jpmc26
8. Januar 2015 um 22:46 Uhr
@ jpmc26 Ich folge coanor nicht genau, aber ich würde sagen, dass (im Gegensatz zu meiner Vermutung) keine Verbindung zwischen dem Argument und dem besteht abspath
Funktion und eine echte Datei. Sie könnten einen beliebigen Pfadnamen angeben – nicht vorhandene Dateien und Verzeichnishierarchien sind in Ordnung – und abspath löst einfach die Bits des Pfads auf (einschließlich des übergeordneten Verzeichnisses “..
“-Element) und geben einen String zurück. Dies ist nur ein String, der aus dem aktuellen Verzeichnis berechnet wird; jede Korrelation mit einer tatsächlichen Datei scheint zufällig zu sein. Versuchen Sie es os.path.abspath("/wow/junk/../blha/hooey")
. Es klappt.
– Mike S
12. September 2018 um 2:01 Uhr
@MikeS Ich bin mir ehrlich gesagt nicht sicher, warum das ein unerwartetes Verhalten wäre. Es ist absolut Weg, nicht absolute Datei oder Verzeichnis. Wenn Sie eine Existenzprüfung wünschen, rufen Sie an os.path.exists
. Im Gegenteil, Systeme wie PowerShell, die darauf bestehen, dass der Pfad mit der Standard-Pfadauflösungsfunktion vorhanden ist, sind mühsam zu verwenden.
– jpmc26
12. September 2018 um 3:28 Uhr
@ jpmc26 Anzunehmen, dass ein Pfad nur eine Zeichenfolge ist, die wie ein Pfadname aussieht, ist überhaupt nicht klar und widerspricht dem, wie ich seit vielen Jahren über Pfadnamen nachdenke und spreche. Ich zitiere die Python 3-Dokumentation für abspath: „Gib eine normalisierte, absolutisierte Version des Pfadnamens zurück Weg.” Nicht eine”…Version des Schnur Weg“. Ein Pfadname, wie von Posix definiert, ist “Eine Zeichenfolge, die verwendet wird, um eine Datei zu identifizieren.” Die Python-Dokumentation geht ausdrücklich darauf ein relpath
: “Auf das Dateisystem wird nicht zugegriffen, um die Existenz oder Art von zu bestätigen path
“. Wenn das Argument hier offensichtlich ist, warum explizit dafür sein relpath
?
– Mike S
17. September 2018 um 18:07 Uhr
twasbrillig
Sie könnten die neue Python 3.4-Bibliothek verwenden pathlib
. (Sie können es auch für Python 2.6 oder 2.7 mit verwenden pip install pathlib
.) Die Autoren schrieb: “Das Ziel dieser Bibliothek ist es, eine einfache Klassenhierarchie bereitzustellen, um Dateisystempfade und die allgemeinen Operationen, die Benutzer über sie ausführen, zu handhaben.”
So erhalten Sie einen absoluten Pfad in Windows:
>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'
Oder unter UNIX:
>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'
Dokumente sind hier: https://docs.python.org/3/library/pathlib.html
Sehr hilfreich. Verwenden os.path.abspath()
gab mir einen Fehler: AttributeError: 'NoneType' object has no attribute 'startswith'
verwenden Path().resolve()
nicht mit dem gleichen relativen Dateipfad. (Linux und Python3.4)
– NuclearPeon
31. August 2015 um 16:14 Uhr
Nach meinem Experiment auf der Fensterplattform resolve()
gibt nur dann den vollständigen Pfad an Sie zurück, wenn dies möglich ist resolve()
Datei. Aber, os.path.abspath
gibt Ihnen trotzdem den vollständigen Pfad zurück, auch wenn die Datei nicht existiert. Unter Linux wird jedoch immer der absolute Pfad zurückgegeben
– Mond Wan
31. Juli 2020 um 9:04 Uhr
Warum ist das, wenn die Path(__file__)
allein (ohne die Auflösungsmethode) in einem Modul verwendet wird, das zusammen mit einem Paket importiert wird, gibt den absoluten Pfad anstelle des relativen Pfads an?
– aderchox
8. August 2020 um 8:50 Uhr
Beachten Sie, dass resolve()
wird symbolischen Links folgen. Wenn Sie dies nicht möchten, verwenden Sie absolute()
stattdessen, wodurch Symlinks nicht aufgelöst werden.
– BallpointBen
18. August 2021 um 16:09 Uhr
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))
Beachten Sie, dass expanduser
ist (unter Unix) erforderlich, falls der angegebene Ausdruck für den Datei- (oder Verzeichnis-) Namen und Speicherort ein führendes Zeichen enthalten kann ~/
(die Tilde bezieht sich auf das Home-Verzeichnis des Benutzers) und expandvars
kümmert sich um alle anderen Umgebungsvariablen (wie $HOME
).
Ich weiß, das ist eine ziemlich alte Antwort, aber gibt es nicht einen Befehl, der all dies in einem Aufruf erledigt? Scheint so, als würde dies den eingehenden Pfad am flexibelsten und daher am häufigsten benötigten machen (zumindest in meinem Fall stimmt das).
– Florian Blume
5. Oktober 2021 um 10:39 Uhr
Tom
Installieren Sie einen Drittanbieter Pfadmodul (gefunden auf PyPI
), es wickelt alle os.path
Funktionen und andere verwandte Funktionen in Methoden für ein Objekt, das überall dort verwendet werden kann, wo Zeichenfolgen verwendet werden:
>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
Update für Python 3.4+ pathlib
das beantwortet eigentlich die frage:
from pathlib import Path
relative = Path("mydir/myfile.txt")
absolute = relative.absolute() # absolute is a Path object
Wenn Sie nur eine temporäre Zeichenfolge benötigen, denken Sie daran, dass Sie verwenden können Path
Objekte mit allen relevanten Funktionen in os.path
darunter natürlich abspath
:
from os.path import abspath
absolute = abspath(relative) # absolute is a str object
Heute können Sie auch die verwenden unipath
Paket, das auf basierte path.py
: http://sluggo.scrapping.cc/python/unipath/
>>> from unipath import Path
>>> absolute_path = Path('mydir/myfile.txt').absolute()
Path('C:\\example\\cwd\\mydir\\myfile.txt')
>>> str(absolute_path)
C:\\example\\cwd\\mydir\\myfile.txt
>>>
Ich würde empfehlen, dieses Paket so zu verwenden, wie es angeboten wird eine saubere Schnittstelle zu gängigen os.path-Dienstprogrammen.
Lucas Azevedo
Dies stets erhält den richtigen Dateinamen des aktuellen Skripts, auch wenn es aus einem anderen Skript heraus aufgerufen wird. Es ist besonders nützlich bei der Verwendung subprocess
.
import sys,os
filename = sys.argv[0]
Von dort aus können Sie den vollständigen Pfad des Skripts abrufen mit:
>>> os.path.abspath(filename)
'/foo/bar/script.py'
Es erleichtert auch das Navigieren in Ordnern, indem es einfach angehängt wird /..
so oft Sie möchten, um in der Verzeichnishierarchie nach oben zu gehen.
So erhalten Sie die cwd:
>>> os.path.abspath(filename+"/..")
'/foo/bar'
Für den übergeordneten Pfad:
>>> os.path.abspath(filename+"/../..")
'/foo'
Durch Kombinieren "/.."
mit anderen Dateinamen können Sie auf jede Datei im System zugreifen.
Das wurde nicht gefragt. Sie fragten nach einem Pfad in Bezug auf das aktuelle Arbeitsverzeichnis, das nicht dasselbe ist wie das Skriptverzeichnis, obwohl sie manchmal denselben Wert haben können.
– Das Elementar der Zerstörung
23. Mai 2019 um 4:16 Uhr
Dies schlägt fehl, wenn das Skript von einem anderen Ort als seinem aktuellen Speicherort aufgerufen wird, beispielsweise aus dem übergeordneten Ordner.
– Marc Compere
4. Juli um 17:30 Uhr
@MarcCompere nein, wird es nicht. Der Wert von filename
wäre anders, aber sobald Sie verwenden os.path.abspath()
Sie erhalten den absoluten Pfad für diese Datei, unabhängig davon, von wo aus Sie sie aufrufen.
– Lucas Azevedo
27. Juli um 9:01 Uhr