it-swarm.com.de

python: Holen Sie sich das Verzeichnis um zwei Ebenen

Ok ... Ich weiß nicht, wo das Modul x ist, aber ich weiß, dass ich den Pfad zum Verzeichnis um zwei Ebenen erhalten muss.

Gibt es einen eleganteren Weg:

import os
two_up = os.path.dirname(os.path.dirname(__file__))

Lösungen für Python 2 und 3 sind willkommen!

50
jramm

Sie können pathlib verwenden. Leider ist dies nur in der stdlib für Python 3.4 verfügbar. Wenn Sie eine ältere Version haben, müssen Sie eine Kopie von PyPI hier installieren. Dies sollte leicht mit pip erfolgen.

from pathlib import Path

p = Path(__file__).parents[1]

print(p)
# /absolute/path/to/two/levels/up

Hierbei wird die Sequenz parents verwendet, die den Zugriff auf die übergeordneten Verzeichnisse ermöglicht und das zweite Verzeichnis auswählt.

Beachten Sie, dass p in diesem Fall eine Form von Path-Objekt mit eigenen Methoden ist. Wenn Sie die Pfade als Zeichenfolge benötigen, können Sie str aufrufen.

59
Ffisegydd

Sehr leicht:

Hier ist was du willst:

import os.path as path

two_up =  path.abspath(path.join(__file__ ,"../.."))

Grüße Sebi

25
Sebi2020

Ich würde das nur als dumm hinzufügen, aber auch, weil es Neulingen den potentiellen Nutzen von Aliasing-Funktionen und/oder Importen zeigt.

Nachdem ich es geschrieben habe, denke ich, dass dieser Code besser lesbar ist (d. H. Weniger Zeit, um die Absicht zu erfassen) als die anderen bisherigen Antworten, und Lesbarkeit ist (normalerweise) König.

from os.path import dirname as up

two_up = up(up(__file__))

Hinweis: Sie möchten dies nur tun, wenn Ihr Modul sehr klein ist oder kontextabhängig ist.

18
andyhasit

Um das Verzeichnis auf 2 Ebenen aufzurufen:

 import os.path as path
 two_up = path.abspath(path.join(os.getcwd(),"../.."))
6
zerocog

Ich persönlich finde, dass die Verwendung des os-Moduls die unten beschriebene einfachste Methode ist. Wenn Sie nur eine Ebene höher gehen, ersetzen Sie ('../ ..') durch ('..').

    import os
    os.chdir('../..')

--Check:
    os.getcwd()
3
M. Murphy

Ich habe festgestellt, dass das folgende in 2.7.x gut funktioniert

import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
2
Lucidious

Die beste Lösung (für Python> = 3.4) bei der Ausführung von einem beliebigen Verzeichnis aus ist:

from pathlib import Path
two_up = Path(__file__).resolve().parents[1]
2
pythinker

Weitere plattformübergreifende Implementierung wird sein:

import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()

Die Verwendung von parent wird unter Windows nicht unterstützt. Sie müssen auch .resolve() hinzufügen: 

Machen Sie den Pfad absolut, indem Sie alle Symlinks auf dem Weg auflösen und auch normalisieren (z. B. Schrägstriche in Backslashes unter Windows umwandeln)

0
Artem Zhukov

Sie können dies als generische Lösung verwenden:

import os

def getParentDir(path, level=1):
  return os.path.normpath( os.path.join(path, *([".."] * level)) )
0
Axel Heider