Как получить родительский каталог

этот код получает шаблоны /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__),".."))

Ответ 1

Вы можете повторно применить имя dirname, чтобы подняться выше: dirname(dirname(file)). Однако это может быть только до корневого пакета. Если это проблема, используйте os.path.abspath: dirname(dirname(abspath(file))).

Ответ 2

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'

Ответ 3

Используйте относительный путь с модулем pathlib в Python 3. 4+:

from pathlib import Path

Path(__file__).parent

Вы можете использовать несколько вызовов parent, чтобы идти дальше по пути:

Path(__file__).parent.parent

В качестве альтернативы двойному указанию parent вы можете использовать:

Path(__file__).parents[1]

Ответ 4

os.path.dirname(os.path.abspath(__file__))

Должен указать путь к a.

Но если b.py - это файл, который в данный момент выполняется, то вы можете добиться того же, просто сделав

os.path.abspath(os.path.join('templates', 'blog1', 'page.html'))

Ответ 5

os.pardir - лучший способ для ../ и более читаемый.

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

Это вернет родительский путь заданного_пакета

Ответ 6

Простым способом может быть:

import os
current_dir =  os.path.abspath(os.path.dirname(__file__))
parent_dir = os.path.abspath(current_dir + "/../")
print parent_dir

Ответ 7

Может быть, присоединить две папки .., чтобы получить родительский элемент родительской папки?

path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)),"..",".."))

Ответ 8

Для перехода к предыдущей папке используйте следующую команду:

os.chdir(os.pardir)

Если вам нужно несколько переходов, хорошим и простым решением будет использование простого декоратора в этом случае.

Ответ 9

Вот еще одно относительно простое решение:

  • не использует 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

Ответ 10

Я думаю, что это лучше:

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'

Ответ 11

Я пробовал:

import os
os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))), os.pardir))