Könnte mir jemand sagen, wie ich das übergeordnete Verzeichnis eines Pfads in Python plattformübergreifend abrufen kann. Z.B
C:\Program Files ---> C:\
und
C:\ ---> C:\
Wenn das Verzeichnis kein übergeordnetes Verzeichnis hat, gibt es das Verzeichnis selbst zurück. Die Frage mag einfach erscheinen, aber ich konnte sie nicht über Google ausgraben.
os.path.dirname
ist die Funktion dafür, wiea+=5-4
ist komplizierter alsa+=1
. Bei der Frage wurde nur das übergeordnete Verzeichnis angefordert, nicht, ob es vorhanden ist, oder das wahre übergeordnete Verzeichnis, sofern symbolische Links im Weg stehen.os.pardir
nichtos.path.pardir
.os.pardir
undos.path.pardir
sind tatsächlich korrekt (sie sind identisch).os.path.dirname
unterschiedliche Ergebnisse, je nachdem, ob ein abschließender Schrägstrich im Pfad enthalten ist. Wenn Sie zuverlässige Ergebnisse erzielen möchten, müssen Sie die in deros.path.join
obigen Antwort angegebene Methode verwenden.Verwenden von
os.path.dirname
:Vorsichtsmaßnahme:
os.path.dirname()
Gibt unterschiedliche Ergebnisse, je nachdem, ob der Pfad einen abschließenden Schrägstrich enthält. Dies kann die gewünschte Semantik sein oder auch nicht. Vgl. @ Kenders Antwort mitos.path.join(yourpath, os.pardir)
.quelle
os.path.dirname(r'C:\Program Files')
Was? Python gibt Ihnen nur das Verzeichnis an, in dem sich die Datei 'Programme' befinden würde. Was mehr ist, muss es nicht einmal existieren, siehe:os.path.dirname(r'c:\i\like\to\eat\pie')
Ausgänge'c:\\i\\like\\to\\eat'
Die Pathlib-Methode (Python 3.4+)
Die traditionelle Methode
Welche Methode soll ich verwenden?
Verwenden Sie die traditionelle Methode, wenn:
Sie sind besorgt über vorhandene Fehler bei der Codegenerierung, wenn ein Pathlib-Objekt verwendet wird. (Da Pathlib-Objekte nicht mit Zeichenfolgen verknüpft werden können.)
Ihre Python-Version ist kleiner als 3.4.
Sie benötigen eine Zeichenfolge und haben eine Zeichenfolge erhalten. Angenommen, Sie haben eine Zeichenfolge, die einen Dateipfad darstellt, und Sie möchten das übergeordnete Verzeichnis abrufen, damit Sie es in eine JSON-Zeichenfolge einfügen können. Es wäre irgendwie albern, dafür in ein Pathlib-Objekt und wieder zurück zu konvertieren.
Wenn keine der oben genannten Bedingungen zutrifft, verwenden Sie Pathlib.
Was ist Pathlib?
Wenn Sie nicht wissen, was Pathlib ist, ist das Pathlib-Modul ein großartiges Modul, das Ihnen das Arbeiten mit Dateien noch einfacher macht. Die meisten, wenn nicht alle integrierten Python-Module, die mit Dateien arbeiten, akzeptieren sowohl Pathlib-Objekte als auch Zeichenfolgen. Ich habe nachfolgend einige Beispiele aus der Pathlib-Dokumentation hervorgehoben , die einige der netten Dinge zeigen, die Sie mit Pathlib tun können.
Navigieren in einem Verzeichnisbaum:
Pfadeigenschaften abfragen:
quelle
pip install pathlib2
den Backport.os.sep
!C:\Program Files
--->C:\\\
C:\
--->C:\\\
quelle
os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..')
Ergebnis:E:\\O3M_Tests_Embedded\\branches
/
.Eine alternative Lösung von @kender
Wo
yourpath
ist der Pfad, für den Sie das übergeordnete Element haben möchten?Diese Lösung ist jedoch nicht perfekt, da sie nicht den Fall behandelt, in dem es sich
yourpath
um eine leere Zeichenfolge oder einen Punkt handelt.Diese andere Lösung wird diesen Eckfall besser handhaben:
Hier die Ausgänge für jeden Fall, der gefunden werden kann (Eingabepfad ist relativ):
Der Eingabepfad ist absolut (Linux-Pfad):
quelle
quelle
os.path.split(os.path.abspath("this/is/a/dir/"))[0]
kehrt'/home/daniel/this/is/a'
wie erwartet zurück. Ich habe im Moment kein laufendes Windows-Kästchen, um es dort zu überprüfen. Bei welchem Setup haben Sie das von Ihnen gemeldete Verhalten beobachtet?parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]
. Ich bin mir sicher, dass dies funktioniert, denn wenn am Ende ein Schrägstrich vorhanden ist, wird dieser entfernt. Wenn kein Schrägstrich vorhanden ist, funktioniert dies aufgrund des vorhergehenden Schrägstrichs weiterhin (auch wenn der letzte Teil des Pfads nur ein Zeichen lang ist). Dies setzt natürlich voraus, dass der Pfad korrekt ist und nicht so etwas wie sagt/a//b/c///d////
(unter Unix ist dies immer noch gültig), was in den meisten Fällen (richtig) ist, insbesondere wenn Sie so etwasos.path.abspath
oder eine andereos.path
Funktion ausführen.os.path.split("a/b//c/d///")
und zum Beispielcd //////dev////// is equivalent to
cd / dev / `oder habencd /dev
; Alle diese sind unter Linux gültig. Ich habe mir das gerade ausgedacht und es kann jedoch nützlich sein :os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]
. (Dies sucht im Wesentlichen nach dem letzten Nicht-Schrägstrich und ruft die Teilzeichenfolge des Pfads bis zu diesem Zeichen ab.) Ich habepath = "/a//b///c///d////"
die oben genannte Anweisung verwendet und dann ausgeführt und erhalten'/a//b///c'
.Beobachten:
quelle
quelle
Wenn Sie nur den Namen des Ordners möchten , der das unmittelbare übergeordnete Element der als Argument angegebenen Datei ist, und nicht den absoluten Pfad zu dieser Datei:
os.path.split(os.path.dirname(currentDir))[1]
dh mit einem
currentDir
Wert von/home/user/path/to/myfile/file.ext
Der obige Befehl gibt Folgendes zurück:
myfile
quelle
Zum Beispiel in Ubuntu:
Zum Beispiel in Windows:
Beide Beispiele wurden in Python 2.7 ausprobiert
quelle
quelle
Angenommen, wir haben eine Verzeichnisstruktur wie
1]
Wir wollen aus dem Verzeichnis R auf den Pfad von "P" zugreifen, dann können wir mit verwenden
2]
Wir möchten vom Verzeichnis R aus auf den Pfad des Verzeichnisses "Q" zugreifen, dann können wir mit verwenden
quelle
Fügen Sie einfach etwas zur Antwort des Tung hinzu (Sie müssen verwenden
rstrip('/')
, um sicherer zu sein, wenn Sie sich auf einer Unix-Box befinden).Aber wenn Sie nicht verwenden
rstrip('/')
, ist Ihre Eingabe gegebenwürde ausgeben,
Das ist wahrscheinlich nicht das, was Sie sehen, da Sie beides wollen
"../data/replies/"
und"../data/replies"
sich gleich verhalten.quelle
quelle
Sie können dies verwenden, um das übergeordnete Verzeichnis des aktuellen Speicherorts Ihrer py-Datei abzurufen.
quelle
Holen Sie sich den Pfad des übergeordneten Verzeichnisses und erstellen Sie ein neues Verzeichnis (Name
new_dir
).Pfad des übergeordneten Verzeichnisses abrufen
Beispiel 1
Beispiel 2
quelle
Also
..
hilft einquelle
quelle
Die oben gegebenen Antworten sind alle vollkommen in Ordnung, um eine oder zwei Verzeichnisebenen zu erreichen, aber sie können etwas umständlich werden, wenn man den Verzeichnisbaum um viele Ebenen (z. B. 5 oder 10) durchlaufen muss. Dies kann präzise erfolgen, indem eine Liste von
N
os.pardir
s in hinzugefügt wirdos.path.join
. Beispiel:quelle