ten kod to szablony / blog1 / page.html w b.py:
path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))
ale chcę uzyskać lokalizację katalogu nadrzędnego:
aParent
|--a
| |---b.py
| |---templates
| |--------blog1
| |-------page.html
|--templates
|--------blog1
|-------page.html
i jak uzyskać lokalizację macierzystą
dzięki
zaktualizowane:
to prawda:
dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))
lub
path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
blog1
luba
? A gdzie znajduje się twój aktualny plik?os.path.join('templates', 'blog1/page.html')
wygląda dla mnie dziwnie. Mieszasz rzeczy. Alboos.path.join('templates', 'blog1', 'page.html')
albo'templates/blog1/page.html'
. I znacznie łatwiej byłobyos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
wtedyOdpowiedzi:
Można zastosować dirname wielokrotnie wspinać się wyżej:
dirname(dirname(file))
. Może to jednak dotyczyć tylko pakietu głównego. Jeśli jest to problem, należyos.path.abspath
:dirname(dirname(abspath(file)))
.źródło
dirname
. Nie dla wszystkich jest oczywiste, że zastosowanie dirname do katalogu daje katalog nadrzędny.dirname
nie nie zawsze powrócić do katalogu nadrzędnego; twitter.com/#!/ActiveState/status/671049326788608/
nie reprezentuje samej pozycji katalogu-liścia, ale jej zawartość, dlatego np.mv xxx yyy/
Zawodzi, jeśliyyy
nie jest wcześniej istniejącym katalogiem. W każdym razie, nawet jeśli przyjmiemy twój punkt widzenia jako dany, nie ma to znaczenia w kontekście mojej odpowiedzi. Anifile
wynikdirname
nigdy nie zakończy się w a/
.dirname
może powrócić'/'
, co wyraźnie kończy się na a/
. To jedyny wyjątek, AFAIK.os.path.abspath
niczego nie weryfikuje, więc jeśli już dołączamy ciągi znaków,__file__
nie ma potrzeby zawracać sobie głowydirname
przyłączaniem się lub tym podobnym. Po prostu potraktuj__file__
jako katalog i zacznij się wspinać:# climb to __file__'s parent's parent: os.path.abspath(__file__ + "/../../")
To znacznie mniej zawiłe niż
os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
i mniej więcej tak łatwe do opanowania jakdirname(dirname(__file__))
. Wspinanie się na więcej niż dwa poziomy zaczyna być śmieszne.Ale ponieważ wiemy, ile poziomów trzeba się wspiąć, możemy to uporządkować za pomocą prostej małej funkcji:
uppath = lambda _path, n: os.sep.join(_path.split(os.sep)[:-n]) # __file__ = "/aParent/templates/blog1/page.html" >>> uppath(__file__, 1) '/aParent/templates/blog1' >>> uppath(__file__, 2) '/aParent/templates' >>> uppath(__file__, 3) '/aParent'
źródło
os.path.abspath(os.path.join(__file__, "..", "..")
bardziej przenośny?Użyj ścieżki względnej z
pathlib
modułem w Pythonie 3.4+:from pathlib import Path Path(__file__).parent
Możesz użyć wielu wywołań,
parent
aby przejść dalej na ścieżce:Jako alternatywę dla określenia
parent
podwójnego możesz użyć:Path(__file__).parents[1]
źródło
str(Path(__file__).parent)
.Powinien dać ci ścieżkę do
a
.Ale jeśli
b.py
jest to plik, który jest aktualnie wykonywany, możesz osiągnąć to samo, robiąc toos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
źródło
dirname()
dwukrotnie. Wszystko, czego teraz potrzebujesz, powinno znajdować się na tej stronie.os.pardir
to lepszy sposób../
i bardziej czytelny.import os print os.path.abspath(os.path.join(given_path, os.pardir))
To zwróci ścieżkę nadrzędną podanej ścieżki
źródło
Prostym sposobem może być:
import os current_dir = os.path.abspath(os.path.dirname(__file__)) parent_dir = os.path.abspath(current_dir + "/../") print parent_dir
źródło
Można dołączyć do dwóch
..
folderów, aby uzyskać nadrzędny folder nadrzędny?path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))
źródło
Użyj następujących, aby przejść do poprzedniego folderu:
Jeśli potrzebujesz wielu skoków, dobrym i łatwym rozwiązaniem będzie w tym przypadku użycie prostego dekoratora.
źródło
Oto kolejne stosunkowo proste rozwiązanie, które:
dirname()
(co nie działa zgodnie z oczekiwaniami z argumentami jednego poziomu, takimi jak „plik.txt” lub rodzicami względnymi, takimi jak „..”)abspath()
(unikając jakichkolwiek założeń dotyczących bieżącego katalogu roboczego), ale zamiast tego zachowuje względny charakter ścieżekpo prostu używa
normpath
ijoin
:def parent(p): return os.path.normpath(os.path.join(p, os.path.pardir)) # Example: for p in ['foo', 'foo/bar/baz', 'with/trailing/slash/', 'dir/file.txt', '../up/', '/abs/path']: print parent(p)
Wynik:
. foo/bar with/trailing dir .. /abs
źródło
Myślę, że użycie tego jest lepsze:
os.path.realpath(__file__).rsplit('/', X)[0] In [1]: __file__ = "/aParent/templates/blog1/page.html" In [2]: os.path.realpath(__file__).rsplit('/', 3)[0] Out[3]: '/aParent' In [4]: __file__ = "/aParent/templates/blog1/page.html" In [5]: os.path.realpath(__file__).rsplit('/', 1)[0] Out[6]: '/aParent/templates/blog1' In [7]: os.path.realpath(__file__).rsplit('/', 2)[0] Out[8]: '/aParent/templates' In [9]: os.path.realpath(__file__).rsplit('/', 3)[0] Out[10]: '/aParent'
źródło
Próbowałem:
import os os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))
źródło