Может кто-нибудь сказать мне, как получить родительский каталог пути в Python кросс-платформенным способом. Например
C:\Program Files ---> C:\
и
C:\ ---> C:\
Если каталог не имеет родительского каталога, он возвращает сам каталог. Вопрос может показаться простым, но я не могу найти его в Google.
os.path.dirname
является функцией для этого, какa+=5-4
более сложным, чемa+=1
. Вопрос задавал только родительский каталог, не существует ли он или истинный родительский каталог, предполагая, что символические ссылки мешают.os.pardir
не такos.path.pardir
.os.pardir
и то, и другоеos.path.pardir
действительно правильно (они идентичны).os.path.dirname
дает разные результаты в зависимости от того, включен ли косой черты в путь. Если вы хотите получить достоверные результаты, вы должны использоватьos.path.join
метод в ответе выше.Использование
os.path.dirname
:Предостережение:
os.path.dirname()
дает разные результаты в зависимости от того, включен ли концевой слеш в путь. Это может или не может быть семантика вы хотите. Ср @ ответ Кендера с помощьюos.path.join(yourpath, os.pardir)
.источник
os.path.dirname(r'C:\Program Files')
что? Python просто дает вам каталог, в котором находится файл Program Files. Более того, он даже не должен существовать, вот:os.path.dirname(r'c:\i\like\to\eat\pie')
результаты'c:\\i\\like\\to\\eat'
Метод Pathlib (Python 3.4+)
Традиционный метод
Какой метод я должен использовать?
Используйте традиционный метод, если:
Вы беспокоитесь о существующем коде, генерирующем ошибки, если бы он использовал объект Pathlib. (Поскольку объекты Pathlib нельзя объединять со строками.)
Ваша версия Python меньше 3.4.
Вам нужна строка, и вы получили строку. Например, у вас есть строка, представляющая путь к файлу, и вы хотите получить родительский каталог, чтобы вы могли поместить его в строку JSON. Было бы глупо конвертировать в объект Pathlib и обратно для этого.
Если ничего из вышеперечисленного не применимо, используйте Pathlib.
Что такое Pathlib?
Если вы не знаете, что такое Pathlib, модуль Pathlib - это потрясающий модуль, который делает работу с файлами еще проще для вас. Большинство, если не все встроенные модули Python, работающие с файлами, будут принимать как объекты Pathlib, так и строки. Ниже я выделил несколько примеров из документации Pathlib, которые демонстрируют некоторые изящные вещи, которые вы можете сделать с Pathlib.
Навигация внутри дерева каталогов:
Запрос свойств пути:
источник
pip install pathlib2
используйте бэкпорт.os.sep
!C:\Program Files
--->C:\\\
C:\
--->C:\\\
источник
os.path.abspath(r'E:\O3M_Tests_Embedded\branches\sw_test_level_gp\test_scripts\..\..')
: Результат:E:\\O3M_Tests_Embedded\\branches
/
.Альтернативное решение @kender
где
yourpath
путь, для которого вы хотите, чтобы родитель.Но это решение не является идеальным, поскольку оно не будет обрабатывать случай, когда
yourpath
есть пустая строка или точка.Это другое решение будет лучше обрабатывать этот угловой случай:
Вот выходные данные для каждого случая, который можно найти (входной путь является относительным):
Путь ввода является абсолютным (путь Linux):
источник
источник
os.path.split(os.path.abspath("this/is/a/dir/"))[0]
возвращается,'/home/daniel/this/is/a'
как и ожидалось. На данный момент у меня нет работающей коробки с Windows, чтобы проверить там. На какой установке вы наблюдали поведение, о котором вы сообщаете?parentdir = os.path.split(os.path.apspath(dir[:-1]))[0]
. Это - я уверен - работает, потому что если на конце есть косая черта, то она удаляется; если косой черты нет, это все равно будет работать (даже если последняя часть пути имеет длину только один символ) из-за предшествующей косой черты. Это, конечно, предполагает, что путь правильный и не говорит что-то вроде/a//b/c///d////
(в unix это все еще верно), что в большинстве случаев (правильно), особенно когда вы выполняете что-то подобноеos.path.abspath
или любую другуюos.path
функцию.os.path.split("a/b//c/d///")
и, например,cd //////dev////// is equivalent to
cd / dev / `orcd /dev
; все они действительны в Linux. Я просто придумал это , и это может быть полезно, хотя:os.path.split(path[:tuple(ind for ind, char in enumerate(path) if char != "/" and char != "\\")[-1]])[0]
. (По сути, он ищет последний не косой черты и получает подстроку пути до этого символа.) Я использовал,path = "/a//b///c///d////"
а затем запустил вышеупомянутое утверждение и получил'/a//b///c'
.Заметим:
источник
источник
Если вы хотите только на имя папки , которая является непосредственным родителем предоставленного файла в качестве аргумента и не на абсолютном пути к этому файлу:
os.path.split(os.path.dirname(currentDir))[1]
т.е. со
currentDir
значением/home/user/path/to/myfile/file.ext
Приведенная выше команда вернет:
myfile
источник
Например в Ubuntu:
Например в Windows:
Оба примера пробовали в Python 2.7
источник
источник
Предположим, у нас есть структура каталогов, как
1]
Мы хотим получить доступ к пути "P" из каталога R, тогда мы можем получить доступ с помощью
2]
Мы хотим получить доступ к пути каталога "Q" из каталога R, тогда мы можем получить доступ с помощью
источник
Просто добавьте что-то к ответу Тунга (вам нужно использовать его,
rstrip('/')
чтобы быть более безопасным, если вы работаете в Unix).Но, если вы не используете
rstrip('/')
, учитывая ваш вкладбудет выводить,
что, вероятно, не то, на что вы смотрите, поскольку вы хотите и того,
"../data/replies/"
и другого"../data/replies"
вести себя одинаково.источник
источник
Вы можете использовать это, чтобы получить родительский каталог текущего местоположения вашего файла py.
источник
ПОЛУЧИТЕ путь родительского каталога и создайте новый каталог (имя
new_dir
)Получить путь к родительскому каталогу
Пример 1
Пример 2
источник
Так
..
помогаетисточник
источник
Все приведенные выше ответы вполне подходят для перехода на один или два уровня каталогов, но они могут стать немного громоздкими, если нужно пройти через дерево каталогов по многим уровням (скажем, 5 или 10). Это можно сделать кратко, присоединив список
N
os.pardir
s вos.path.join
. Пример:источник