Подтвердить что ты не робот

Python: получить каталог на два уровня вверх

Хорошо... Я не знаю, где находится модуль x, но я знаю, что мне нужно получить путь к каталогу на два уровня вверх.

Итак, есть ли более элегантный способ:

import os
two_up = os.path.dirname(os.path.dirname(__file__))
4b9b3361

Ответ 1

Вы можете использовать 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 на них.

Ответ 2

Очень просто:

Вот что вы хотите:

import os.path as path
import sys

two_up =  path.abspath(path.join(__file__ ,"../.."))

С уважением, Себи

Ответ 3

Я собирался добавить это просто глупо, но также потому, что он показывает новичкам потенциальную полезность функций псевдонимов и/или импорта.

Написав это, я думаю, что этот код более читабельен (т.е. меньше времени, чтобы понять намерение), чем другие ответы на сегодняшний день, а читаемость (обычно) короля.

from os.path import dirname as up

two_up = up(up(__file__))

Примечание: вы хотите делать это только в том случае, если ваш модуль очень мал или контекстуально сплочен.

Ответ 4

Лично я считаю, что использование os-модуля - самый простой способ, как описано ниже. Если вы поднимаетесь только на один уровень, замените ( "../.." ) на ( ".." ).

    import os
    os.chdir('../..')

--Check:
    os.getcwd()

Ответ 5

Для повышения уровня директории 2:

 import os.path as path
 two_up = path.abspath(path.join(os.getcwd(),"../.."))

Ответ 6

Я обнаружил, что следующее хорошо работает в 2.7.x

import os
two_up = os.path.normpath(os.path.join(__file__,'../'))

Ответ 7

Вы можете использовать это как общее решение:

import os

def getParentDir(path, level=1):
  return os.path.normpath( os.path.join(path, *([".."] * level)) )

Ответ 8

Более кросс-платформенная реализация будет:

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)

Ответ 9

Я пока не вижу жизнеспособного ответа для 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

Это очевидная экстраполяция ответа для родительского каталога. Лучше использовать общее решение, чем менее хорошее решение в меньшем количестве строк.