556 Stimmen

Wie erhalte ich das übergeordnete Verzeichnis in Python?

Könnte mir jemand sagen, wie man das übergeordnete Verzeichnis eines Pfades in Python in einem Cross-Plattform Weg zu erhalten. Z.B..

C:\Program Files ---> C:\

und

C:\ ---> C:\

Wenn das Verzeichnis kein übergeordnetes Verzeichnis hat, wird das Verzeichnis selbst zurückgegeben. Die Frage mag einfach erscheinen, aber ich konnte sie nicht über Google ausgraben.

790voto

kender Punkte 82504

Python 3.4

Verwenden Sie die pathlib Modul.

from pathlib import Path
path = Path("/here/your/path/file.txt")
print(path.parent.absolute())

Alte Antwort

Versuchen Sie dies:

import os
print os.path.abspath(os.path.join(yourpath, os.pardir))

wobei yourpath ist der Pfad, für den Sie das übergeordnete Element wünschen.

407voto

Wai Yip Tung Punkte 17066

使用方法 os.path.dirname :

>>> os.path.dirname(r'C:\Program Files')
'C:\\'
>>> os.path.dirname('C:\\')
'C:\\'
>>>

Vorbehalt: os.path.dirname() ergibt unterschiedliche Ergebnisse, je nachdem, ob ein abschließender Schrägstrich im Pfad enthalten ist. Dies kann die von Ihnen gewünschte Semantik sein oder auch nicht. Vgl. @kender's Antwort mit os.path.join(yourpath, os.pardir) .

164voto

Die Pathlib-Methode (Python 3.4+)

from pathlib import Path
Path('C:\Program Files').parent
# Returns a Pathlib object

Die traditionelle Methode

import os.path
os.path.dirname('C:\Program Files')
# Returns a string

Welche Methode sollte ich anwenden?

Verwenden Sie die traditionelle Methode, wenn:

  • Sie befürchten, dass vorhandener Code Fehler erzeugen könnte, wenn er ein Pathlib-Objekt verwenden würde. (Da Pathlib-Objekte nicht mit Zeichenketten verkettet werden können).

  • Ihre Python-Version ist kleiner als 3.4.

  • Sie brauchen eine Zeichenfolge, und Sie haben eine Zeichenfolge erhalten. Nehmen wir an, Sie haben eine Zeichenkette, die einen Dateipfad darstellt, und Sie möchten das übergeordnete Verzeichnis abrufen, um es in eine JSON-Zeichenkette zu übertragen. Es wäre ziemlich albern, dafür in ein Pathlib-Objekt und wieder zurück zu konvertieren.

Wenn keiner der oben genannten Punkte zutrifft, verwenden Sie Pathlib.


Was ist Pathlib?

Wenn Sie nicht wissen, was Pathlib ist, ist das Pathlib-Modul ein großartiges Modul, das Ihnen die Arbeit mit Dateien noch einfacher macht. Die meisten, wenn nicht sogar alle der eingebauten Python-Module, die mit Dateien arbeiten, akzeptieren sowohl Pathlib-Objekte als auch Strings. Im Folgenden habe ich einige Beispiele aus dem Modul Pathlib-Dokumentation die einige der schönen Dinge zeigen, die man mit Pathlib machen kann.

Navigieren innerhalb eines Verzeichnisbaums:

>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')

Abfrage von Pfadeigenschaften:

>>> q.exists()
True
>>> q.is_dir()
False

50voto

ivo Punkte 3981
import os
p = os.path.abspath('..')

C:\Program Files ---> C:\\\

C:\ ---> C:\\\

36voto

benjarobin Punkte 4282

Eine alternative Lösung von @kender

import os
os.path.dirname(os.path.normpath(yourpath))

wobei yourpath ist der Pfad, für den Sie das übergeordnete Element wünschen.

Diese Lösung ist jedoch nicht perfekt, da sie nicht den Fall behandelt, dass yourpath ist eine leere Zeichenkette oder ein Punkt.

Diese andere Lösung wird diesen Eckfall besser lösen:

import os
os.path.normpath(os.path.join(yourpath, os.pardir))

Hier die Ausgaben für jeden Fall, der gefunden werden kann (Eingabepfad ist relativ):

os.path.dirname(os.path.normpath('a/b/'))          => 'a'
os.path.normpath(os.path.join('a/b/', os.pardir))  => 'a'

os.path.dirname(os.path.normpath('a/b'))           => 'a'
os.path.normpath(os.path.join('a/b', os.pardir))   => 'a'

os.path.dirname(os.path.normpath('a/'))            => ''
os.path.normpath(os.path.join('a/', os.pardir))    => '.'

os.path.dirname(os.path.normpath('a'))             => ''
os.path.normpath(os.path.join('a', os.pardir))     => '.'

os.path.dirname(os.path.normpath('.'))             => ''
os.path.normpath(os.path.join('.', os.pardir))     => '..'

os.path.dirname(os.path.normpath(''))              => ''
os.path.normpath(os.path.join('', os.pardir))      => '..'

os.path.dirname(os.path.normpath('..'))            => ''
os.path.normpath(os.path.join('..', os.pardir))    => '../..'

Der Eingabepfad ist absolut (Linux-Pfad):

os.path.dirname(os.path.normpath('/a/b'))          => '/a'
os.path.normpath(os.path.join('/a/b', os.pardir))  => '/a'

os.path.dirname(os.path.normpath('/a'))            => '/'
os.path.normpath(os.path.join('/a', os.pardir))    => '/'

os.path.dirname(os.path.normpath('/'))             => '/'
os.path.normpath(os.path.join('/', os.pardir))     => '/'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X