этот код получает шаблоны / blog1 / page.html в b.py:
path = os.path.join(os.path.dirname(__file__), os.path.join('templates', 'blog1/page.html'))
но я хочу получить местоположение родительского каталога:
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__),".."))
blog1
илиa
? А где находится ваш текущий файл?os.path.join('templates', 'blog1/page.html')
мне кажется странным. Вы все путаете. Либо,os.path.join('templates', 'blog1', 'page.html')
либо'templates/blog1/page.html'
. И гораздо легче будетos.path.abspath(os.path.join('templates', 'blog1', 'page.html'))
потомОтветы:
Вы можете применить несколько раз , чтобы имя - каталога подняться выше:
dirname(dirname(file))
. Однако это может доходить только до корневого пакета. Если это проблема, используйтеos.path.abspath
:dirname(dirname(abspath(file)))
.источник
dirname
. Не для всех очевидно, что применение dirname к каталогу дает родительский каталог.dirname
это НЕ всегда возвращает родительский каталог; twitter.com/#!/ActiveState/status/671049326788608/
представляет собой не сам элемент конечного каталога, а его содержимое, поэтому, например, онmv xxx yyy/
завершается неудачно, еслиyyy
это не существующий каталог. В любом случае, даже если мы примем вашу точку зрения как данность, она не имеет значения в контексте моего ответа. Ни один,file
ни результатdirname
никогда не закончатся/
.dirname
может вернуться'/'
, что явно заканчивается на/
. Это единственное исключение, AFAIK.os.path.abspath
ничего не проверяет, поэтому, если мы уже добавляем строки__file__
, нет необходимости беспокоиться оdirname
присоединении или чем-либо из этого. Просто относитесь__file__
к справочнику и начинайте лазить:Это гораздо менее запутанно,
os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
и примерно так же управляемо, какdirname(dirname(__file__))
. Подниматься более чем на два уровня становится нелепо.Но, поскольку мы знаем, сколько уровней нужно подняться, мы могли бы очистить это с помощью простой небольшой функции:
источник
os.path.abspath(os.path.join(__file__, "..", "..")
бы более портативным?Используйте относительный путь с
pathlib
модулем в Python 3.4+:Вы можете использовать несколько вызовов, чтобы
parent
продолжить путь:В качестве альтернативы двойному указанию
parent
вы можете использовать:источник
str(Path(__file__).parent)
.Должен дать вам путь к
a
.Но если
b.py
это файл, который в настоящее время выполняется, вы можете добиться того же, просто выполнивисточник
dirname()
дважды. Все, что вам сейчас нужно, должно быть на этом сайте.os.pardir
это лучший способ../
и более читаемый.Это вернет родительский путь given_path
источник
Простым способом может быть:
источник
Может быть, объединить две
..
папки, чтобы получить родительскую часть родительской папки?источник
Для перехода к предыдущей папке используйте следующее:
Если вам нужно несколько прыжков, хорошим и легким решением будет использование в этом случае простого декоратора.
источник
Вот еще одно относительно простое решение, которое:
dirname()
(что не работает должным образом с аргументами одного уровня, такими как "file.txt" или относительными родителями, такими как "..")abspath()
(избегая любых предположений о текущем рабочем каталоге), но вместо этого сохраняет относительный характер путейон просто использует
normpath
иjoin
:Результат:
источник
Думаю, лучше использовать это:
источник
Я попытался:
источник