Хорошо... Я не знаю, где находится модуль x
, но я знаю, что мне нужно получить путь к каталогу на два уровня вверх.
Итак, есть ли более элегантный способ:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Хорошо... Я не знаю, где находится модуль x
, но я знаю, что мне нужно получить путь к каталогу на два уровня вверх.
Итак, есть ли более элегантный способ:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Вы можете использовать pathlib
. К сожалению, это доступно только в stdlib для Python 3.4. Если у вас более старая версия, вам придется установить копию из PyPI здесь. Это должно быть легко сделать с помощью pip
.
from pathlib import Path
p = Path(__file__).parents[1]
print(p)
# /absolute/path/to/two/levels/up
Здесь используется последовательность parents
, которая обеспечивает доступ к родительским каталогам и выбирает второй.
Обратите внимание, что p
в этом случае будет какой-то формой объекта Path
со своими собственными методами. Если вам нужны пути как строка, вы можете вызвать str
на них.
Очень просто:
Вот что вы хотите:
import os.path as path
import sys
two_up = path.abspath(path.join(__file__ ,"../.."))
С уважением, Себи
Я собирался добавить это просто глупо, но также потому, что он показывает новичкам потенциальную полезность функций псевдонимов и/или импорта.
Написав это, я думаю, что этот код более читабельен (т.е. меньше времени, чтобы понять намерение), чем другие ответы на сегодняшний день, а читаемость (обычно) короля.
from os.path import dirname as up
two_up = up(up(__file__))
Примечание: вы хотите делать это только в том случае, если ваш модуль очень мал или контекстуально сплочен.
Лично я считаю, что использование os-модуля - самый простой способ, как описано ниже. Если вы поднимаетесь только на один уровень, замените ( "../.." ) на ( ".." ).
import os
os.chdir('../..')
--Check:
os.getcwd()
Для повышения уровня директории 2:
import os.path as path
two_up = path.abspath(path.join(os.getcwd(),"../.."))
Я обнаружил, что следующее хорошо работает в 2.7.x
import os
two_up = os.path.normpath(os.path.join(__file__,'../'))
Вы можете использовать это как общее решение:
import os
def getParentDir(path, level=1):
return os.path.normpath( os.path.join(path, *([".."] * level)) )
Более кросс-платформенная реализация будет:
import pathlib
two_up = (pathlib.Path(__file__) / ".." / "..").resolve()
Использование parent
не поддерживается в Windows. Также необходимо добавить .resolve()
, чтобы:
Make the path absolute, resolving all symlinks on the way and also
normalizing it (for example turning slashes into backslashes under
Windows)
Я пока не вижу жизнеспособного ответа для 2.7, который не требует установки дополнительных зависимостей, а также начинается с каталога файлов. Это не очень хорошо, как однострочное решение, но нет ничего плохого в использовании стандартных утилит.
import os
grandparent_dir = os.path.abspath( # Convert into absolute path string
os.path.join( # Current file grandparent directory
os.path.join( # Current file parent directory
os.path.dirname( # Current file directory
os.path.abspath(__file__) # Current file path
),
os.pardir
),
os.pardir
)
)
print grandparent_dir
И чтобы доказать, что это работает, здесь я начинаю в ~/Documents/notes
, так что я показываю, что текущий каталог не влияет на результат. Я помещал файл grandpa.py
с этим script в папку под названием "scripts". Он переполняется в директорию Documents, а затем в директорию пользователя на 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
Это очевидная экстраполяция ответа для родительского каталога. Лучше использовать общее решение, чем менее хорошее решение в меньшем количестве строк.