Ответ 1
Вы можете повторно применить имя dirname, чтобы подняться выше: dirname(dirname(file))
. Однако это может быть только до корневого пакета. Если это проблема, используйте os.path.abspath
: dirname(dirname(abspath(file)))
.
этот код получает шаблоны /blog 1/page.html в b.py:
path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))
но я хочу получить родительское расположение dir:
aParent
|--a
| |---b.py
| |---templates
| |--------blog1
| |-------page.html
|--templates
|--------blog1
|-------page.html
и как получить расположение aParent
спасибо
обновление:
это правильно:
dirname=os.path.dirname
path = os.path.join(dirname(dirname(__file__)), os.path.join('templates', 'blog1/page.html'))
или
path = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
Вы можете повторно применить имя dirname, чтобы подняться выше: dirname(dirname(file))
. Однако это может быть только до корневого пакета. Если это проблема, используйте os.path.abspath
: dirname(dirname(abspath(file)))
.
os.path.abspath
ничего не проверяет, поэтому, если мы уже добавляем строки в __file__
, вам не нужно беспокоиться о dirname
или присоединении или любом из них. Просто рассматривайте __file__
как каталог и начинайте лазать:
# climb to __file__ parent parent:
os.path.abspath(__file__ + "/../../")
Это гораздо меньше, чем os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
и примерно такое же управляемое, как dirname(dirname(__file__))
. Восхождение на более чем два уровня начинает смеяться.
Но, поскольку мы знаем, сколько уровней нужно поднимать, мы могли бы очистить это с помощью простой небольшой функции:
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'
Используйте относительный путь с модулем pathlib
в Python 3. 4+:
from pathlib import Path
Path(__file__).parent
Вы можете использовать несколько вызовов parent
, чтобы идти дальше по пути:
Path(__file__).parent.parent
В качестве альтернативы двойному указанию parent
вы можете использовать:
Path(__file__).parents[1]
os.path.dirname(os.path.abspath(__file__))
Должен указать путь к a
.
Но если b.py
- это файл, который в данный момент выполняется, то вы можете добиться того же, просто сделав
os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
os.pardir
- лучший способ для ../
и более читаемый.
import os
print os.path.abspath(os.path.join(given_path, os.pardir))
Это вернет родительский путь заданного_пакета
Простым способом может быть:
import os
current_dir = os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.abspath(current_dir + "/../")
print parent_dir
Может быть, присоединить две папки ..
, чтобы получить родительский элемент родительской папки?
path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))
Для перехода к предыдущей папке используйте следующую команду:
os.chdir(os.pardir)
Если вам нужно несколько переходов, хорошим и простым решением будет использование простого декоратора в этом случае.
Вот еще одно относительно простое решение:
dirname()
(который не работает так, как ожидалось, на одном уровне аргументов, таких как "file.txt" или родственников, таких как ".." )abspath()
(избегая любых предположений о текущем рабочем каталоге), но вместо этого сохраняет относительный характер путейон просто использует normpath
и join
:
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)
Результат:
.
foo/bar
with/trailing
dir
..
/abs
Я думаю, что это лучше:
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'
Я пробовал:
import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))