Хорошо ... Я не знаю, где x
находится модуль , но я знаю, что мне нужно получить путь к каталогу на два уровня выше.
Итак, есть ли более элегантный способ:
import os
two_up = os.path.dirname(os.path.dirname(__file__))
Решения для Python 2 и 3 приветствуются!
python
path
operating-system
directory
Джрамм
источник
источник
pathlib
Решение немного лучше и более удобным для чтения, но не входит в Python 2.7. Я бы сказал, придерживайтесь того, что у вас есть, может быть, добавьте комментарий.pip install pathlib2
в 2.7 опцию сохранения здравомыслия.Ответы:
Вы можете использовать
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
.источник
Path
классparents
зависит от места выполнения. Если вы запустите свой__file__
из текущего каталога, уPath
класса не будет родителей. Либо следует принять ответ @ Sebi2020, либо использовать ваш исходный метод. Я считаю, что ваш оригинальный метод более читабелен.p = Path(os.path.abspath(__file__)).parents[1]
os.path.abspath
, вы также можете использоватьPath(__file__).resolve().parents[1]
p = Path(__file__).resolve().parents[1]
. Я тоже добавил это в качестве ответа.Очень просто:
Вот что вам нужно:
import os.path as path two_up = path.abspath(path.join(__file__ ,"../.."))
источник
os.pardir
лучше использовать , чем..
.__file__
.Я собирался добавить это просто для глупости, но еще и потому, что это показывает новичкам потенциальную полезность функций сглаживания и / или импорта.
Написав его, я думаю, что этот код более читабелен (то есть меньше времени для понимания намерения), чем другие ответы на сегодняшний день, и читаемость (обычно) является королем.
from os.path import dirname as up two_up = up(up(__file__))
Примечание: вы хотите делать такие вещи только в том случае, если ваш модуль очень маленький или контекстно связный.
источник
Лучшее решение (для python> = 3.4) при выполнении из любого каталога:
from pathlib import Path two_up = Path(__file__).resolve().parents[1]
источник
Чтобы поднять каталог на 2 уровня:
import os.path as path two_up = path.abspath(path.join(os.getcwd(),"../.."))
источник
Лично я считаю, что использование модуля os - самый простой способ, описанный ниже. Если вы поднимаетесь только на один уровень, замените ('../ ..') на ('..').
import os os.chdir('../..') --Check: 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()
, чтобы:источник
parent
не работает Windows? Кажется, это было исправлено с тех пор, как вы написали этот комментарий. У меня он отлично работает с Python 3.7.2 в Windows 10.parent
работать с Windows 10 с помощью Python 3.6.5. О какой версии python вы говорите @Zhukovgeen?Предполагая, что вы хотите получить доступ к папке с именем xzy, две папки в вашем файле python. Это работает для меня и не зависит от платформы.
".././xyz"
источник
(pathlib.Path ('../../')) .resolve ()
источник
Я пока не вижу жизнеспособного ответа для 2.7, который не требует установки дополнительных зависимостей и также запускается из каталога файлов. Это нехорошо как однострочное решение, но в использовании стандартных утилит нет ничего плохого.
import os grandparent_dir = os.path.abspath( # Convert into absolute path string os.path.join( # Current file's grandparent directory os.path.join( # Current file's parent directory os.path.dirname( # Current file's directory os.path.abspath(__file__) # Current file path ), os.pardir ), os.pardir ) ) print grandparent_dir
И чтобы доказать, что это работает, я начинаю с
~/Documents/notes
того, чтобы показать, что текущий каталог не влияет на результат. Я положил файлgrandpa.py
с этим сценарием в папку с названием "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
Это очевидная экстраполяция ответа на родительский каталог . Лучше использовать общее решение, чем менее хорошее решение в меньшем количестве строк.
источник