Как мне получить родительский каталог в Python? - PullRequest
278 голосов
/ 18 мая 2010

Может кто-нибудь сказать мне, как получить родительский каталог пути в Python кросс-платформенным способом. Э.Г.

C:\Program Files ---> C:\

и

C:\ ---> C:\

Если каталог не имеет родительского каталога, он возвращает сам каталог. Вопрос может показаться простым, но я не могу найти его в Google.

Ответы [ 18 ]

371 голосов
/ 18 мая 2010

Попробуйте это:

import os.path
print os.path.abspath(os.path.join(yourpath, os.pardir))

где yourpath - путь, для которого вы хотите родителя.

293 голосов
/ 18 мая 2010

Использование os.path.dirname:

>>> os.path.dirname(r'C:\Program Files')
'C:\\'
>>> os.path.dirname('C:\\')
'C:\\'
>>>

Предостережение: os.path.dirname() дает разные результаты в зависимости от того, включен ли косой черты в путь. Это может или не может быть семантика вы хотите. Ср @ Кендер ответ, используя os.path.join(yourpath, os.pardir).

101 голосов
/ 19 марта 2015

В Python 3.4 +

from pathlib import Path
Path('C:\Program Files').parent

Документация Python


Дополнительная информация

Новая библиотека pathlib объединяет и упрощает использование путей и общих файловых операций. Вот несколько примеров из документов.

Навигация внутри дерева каталогов:

>>>
>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')

Запрос свойств пути:

>>>
>>> q.exists()
True
>>> q.is_dir()
False
23 голосов
/ 18 мая 2010
import os
p = os.path.abspath('..')

C:\Program Files ---> C:\\\

C:\ ---> C:\\\

18 голосов
/ 04 сентября 2014

Альтернативное решение @ kender

import os
os.path.dirname(os.path.normpath(yourpath))

где yourpath - путь, для которого вы хотите родителя.

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

Это другое решение будет лучше работать с этим угловым корпусом:

import os
os.path.normpath(os.path.join(yourpath, os.pardir))

Вот выходные данные для каждого случая, который можно найти (входной путь относительный):

os.path.dirname(os.path.normpath('a/b/'))          => 'a'
os.path.normpath(os.path.join('a/b/', os.pardir))  => 'a'

os.path.dirname(os.path.normpath('a/b'))           => 'a'
os.path.normpath(os.path.join('a/b', os.pardir))   => 'a'

os.path.dirname(os.path.normpath('a/'))            => ''
os.path.normpath(os.path.join('a/', os.pardir))    => '.'

os.path.dirname(os.path.normpath('a'))             => ''
os.path.normpath(os.path.join('a', os.pardir))     => '.'

os.path.dirname(os.path.normpath('.'))             => ''
os.path.normpath(os.path.join('.', os.pardir))     => '..'

os.path.dirname(os.path.normpath(''))              => ''
os.path.normpath(os.path.join('', os.pardir))      => '..'

os.path.dirname(os.path.normpath('..'))            => ''
os.path.normpath(os.path.join('..', os.pardir))    => '../..'

Путь ввода является абсолютным (путь Linux):

os.path.dirname(os.path.normpath('/a/b'))          => '/a'
os.path.normpath(os.path.join('/a/b', os.pardir))  => '/a'

os.path.dirname(os.path.normpath('/a'))            => '/'
os.path.normpath(os.path.join('/a', os.pardir))    => '/'

os.path.dirname(os.path.normpath('/'))             => '/'
os.path.normpath(os.path.join('/', os.pardir))     => '/'
17 голосов
/ 18 мая 2010
os.path.split(os.path.abspath(mydir))[0]
13 голосов
/ 18 мая 2010
os.path.abspath(os.path.join(somepath, '..'))

Обратите внимание:

import posixpath
import ntpath

print ntpath.abspath(ntpath.join('C:\\', '..'))
print ntpath.abspath(ntpath.join('C:\\foo', '..'))
print posixpath.abspath(posixpath.join('/', '..'))
print posixpath.abspath(posixpath.join('/home', '..'))
7 голосов
/ 23 февраля 2013
import os
print"------------------------------------------------------------"
SITE_ROOT = os.path.dirname(os.path.realpath(__file__))
print("example 1: "+SITE_ROOT)
PARENT_ROOT=os.path.abspath(os.path.join(SITE_ROOT, os.pardir))
print("example 2: "+PARENT_ROOT)
GRANDPAPA_ROOT=os.path.abspath(os.path.join(PARENT_ROOT, os.pardir))
print("example 3: "+GRANDPAPA_ROOT)
print "------------------------------------------------------------"
4 голосов
/ 29 августа 2015

Если вы хотите, чтобы только имя папки, которая является непосредственным родителем файла, предоставленного в качестве аргумента, и не абсолютный путь к этому файлу:

os.path.split(os.path.dirname(currentDir))[1]

т.е. со значением currentDir /home/user/path/to/myfile/file.ext

Приведенная выше команда вернет:

myfile

3 голосов
/ 03 апреля 2018
>>> import os
>>> os.path.basename(os.path.dirname(<your_path>))

Например, в Ubuntu:

>>> my_path = '/home/user/documents'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'user'

Например в Windows:

>>> my_path = 'C:\WINDOWS\system32'
>>> os.path.basename(os.path.dirname(my_path))
# Output: 'WINDOWS'

Оба примера пробовали в Python 2.7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...