Ok ... Ich weiß nicht, wo sich das Modul x
befindet, aber ich weiß, dass ich den Pfad zum Verzeichnis zwei Ebenen höher finden muss.
Gibt es eine elegantere Möglichkeit:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Lösungen für Python 2 und 3 sind willkommen!
pathlib
Lösung ist etwas besser und besser lesbar, ist jedoch in Python 2.7 nicht enthalten. Ich würde sagen, bleib bei dem, was du hast, füge vielleicht einen Kommentar hinzu.pip install pathlib2
Option zur Aufrechterhaltung der geistigen Gesundheit in 2.7 hinzuzufügen .Antworten:
Sie können verwenden
pathlib
. Leider ist dies nur in der stdlib für Python 3.4 verfügbar. Wenn Sie eine ältere Version haben, müssen Sie hier eine Kopie von PyPI installieren . Dies sollte einfach zu handhaben seinpip
.from pathlib import Path p = Path(__file__).parents[1] print(p) # /absolute/path/to/two/levels/up
Dies verwendet die
parents
Sequenz, die den Zugriff auf die übergeordneten Verzeichnisse ermöglicht, und wählt die zweite aus.Beachten Sie, dass es sich
p
in diesem Fall um eine ArtPath
Objekt mit eigenen Methoden handelt. Wenn Sie die Pfade als Zeichenfolge benötigen, können Sie sie aufrufenstr
.quelle
Path
Klasseparents
vom Ausführungsort abhängt. Wenn Sie Ihre__file__
aus dem aktuellen Verzeichnis ausführen, hat diePath
Klasse keine Eltern. Entweder sollte die Antwort von @ Sebi2020 akzeptiert werden, oder es sollte Ihre ursprüngliche Methode verwendet werden. Ich glaube, Ihre ursprüngliche Methode ist besser lesbar.p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
können Sie auch verwendenPath(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
. Ich habe es auch als Antwort hinzugefügt.Sehr leicht:
Folgendes möchten Sie:
import os.path as path two_up = path.abspath(path.join(__file__ ,"../.."))
quelle
os.pardir
eher verwenden als..
.__file__
.Ich wollte dies nur hinzufügen, um albern zu sein, aber auch, weil es Neulingen die potenzielle Nützlichkeit von Aliasing-Funktionen und / oder Importen zeigt.
Nachdem ich es geschrieben habe, denke ich, dass dieser Code besser lesbar ist (dh weniger Zeit, um die Absicht zu erfassen) als die anderen bisherigen Antworten, und die 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 oder kontextbezogen ist.
quelle
Die beste Lösung (für Python> = 3.4) bei der Ausführung aus einem beliebigen Verzeichnis ist:
from pathlib import Path two_up = Path(__file__).resolve().parents[1]
quelle
Um das Verzeichnis 2 zu verbessern:
import os.path as path two_up = path.abspath(path.join(os.getcwd(),"../.."))
quelle
Persönlich finde ich, dass die Verwendung des OS-Moduls die einfachste Methode ist, wie unten beschrieben. Wenn Sie nur eine Ebene höher gehen, ersetzen Sie ('../ ..') durch ('..').
import os os.chdir('../..') --Check: os.getcwd()
quelle
Ich habe festgestellt, dass das Folgende in 2.7.x gut funktioniert
import os two_up = os.path.normpath(os.path.join(__file__,'../'))
quelle
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)) )
quelle
Weitere plattformübergreifende Implementierung wird sein:
import pathlib two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
Die Verwendung
parent
wird unter Windows nicht unterstützt. Müssen auch hinzufügen.resolve()
, um:quelle
parent
nicht unter Windows arbeiten? Dies scheint irgendwann behoben worden zu sein, seit Sie diesen Kommentar geschrieben haben. Es funktioniert gut für mich mit Python 3.7.2 unter Windows 10.parent
an Windows 10 mit Python 3.6.5 arbeiten. Von welcher Python-Version sprichst du @Zhukovgeen?Angenommen, Sie möchten auf den Ordner xzy zwei Ordner in Ihrer Python-Datei zugreifen. Dies funktioniert für mich und plattformunabhängig.
".././xyz"
quelle
(pathlib.Path ('../../')) .resolve ()
quelle
Ich sehe noch keine brauchbare Antwort für 2.7, für die keine zusätzlichen Abhängigkeiten installiert werden müssen und die auch im Verzeichnis der Datei beginnt. Als einzeilige Lösung ist es nicht schön, aber es ist nichts Falsches daran, die Standarddienstprogramme zu verwenden.
import os grandparent_dir = os.path.abspath( # Convert into absolute path string os.path.join( # Current file's grandparent directory os.path.join( # Current file's parent directory os.path.dirname( # Current file's directory os.path.abspath(__file__) # Current file path ), os.pardir ), os.pardir ) ) print grandparent_dir
Und um zu beweisen, dass es funktioniert, beginne ich hier
~/Documents/notes
nur damit, dass das aktuelle Verzeichnis keinen Einfluss auf das Ergebnis hat. Ich habe die Dateigrandpa.py
mit diesem Skript in einem Ordner namens "scripts" abgelegt . Es kriecht zum Dokumentverzeichnis und dann zum Benutzerverzeichnis auf einem Mac.(testing)AlanSE-OSX:notes AlanSE$ echo ~/Documents/scripts/grandpa.py /Users/alancoding/Documents/scripts/grandpa.py (testing)AlanSE-OSX:notes AlanSE$ python2.7 ~/Documents/scripts/grandpa.py /Users/alancoding
Dies ist die offensichtliche Extrapolation der Antwort für das übergeordnete Verzeichnis . Verwenden Sie lieber eine allgemeine Lösung als eine weniger gute Lösung in weniger Zeilen.
quelle