Как получить родительский каталог в Python?

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

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

и

C:\ ---> C:\

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

Ответ 1

Обновление с Python 3.4

Используйте модуль pathlib.

from pathlib import Path
path = Path("/here/your/path/file.txt")
print(path.parent)

Старый ответ

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

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

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

Ответ 2

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

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

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

Ответ 3

В Python 3. 4+

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

документация pathlib


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

Новая библиотека 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

Ответ 4

import os
p = os.path.abspath('..')

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

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

Ответ 5

Альтернативное решение @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))     => '/'

Ответ 6

os.path.split(os.path.abspath(mydir))[0]

Ответ 7

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', '..'))

Ответ 8

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 "------------------------------------------------------------"

Ответ 9

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

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

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

Вышеуказанная команда вернет:

myfile

Ответ 10

>>> 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

Ответ 11

import os.path

os.path.abspath(os.pardir)

Ответ 12

Просто добавив что-то к ответу Тунга (вам нужно использовать rstrip('/'), чтобы быть более безопасной стороной, если вы находитесь в окне unix).

>>> input = "../data/replies/"
>>> os.path.dirname(input.rstrip('/'))
'../data'
>>> input = "../data/replies"
>>> os.path.dirname(input.rstrip('/'))
'../data'

Но, если вы не используете rstrip('/'), учитывая, что ваш ввод

>>> input = "../data/replies/"

будет выводиться,

>>> os.path.dirname(input)
'../data/replies'

который, вероятно, не является тем, на что вы смотрите, поскольку вы хотите, чтобы оба "../data/replies/" и "../data/replies" вели себя одинаково.

Ответ 13

print os.path.abspath(os.path.join(os.getcwd(), os.path.pardir))

Вы можете использовать это, чтобы получить родительский каталог текущего местоположения вашего файла py.

Ответ 14

import os

dir_path = os.path.dirname(os.path.realpath(__file__))
parent_path = os.path.abspath(os.path.join(dir_path, os.pardir))

Ответ 15

Предположим, у нас есть структура каталогов, например,

1]

/home/User/P/Q/R

Мы хотим получить доступ к пути "P" из каталога R, тогда мы можем получить доступ с помощью

ROOT = os.path.abspath(os.path.join("..", os.pardir));

2]

/home/User/P/Q/R

Мы хотим получить доступ к пути к каталогу "Q" из каталога R, тогда мы можем получить доступ с помощью

ROOT = os.path.abspath(os.path.join(".", os.pardir));

Ответ 16

GET Parent Directory Path и создать новый каталог (name new_dir)

Получить родительский путь к каталогу

os.path.abspath('..')
os.pardir

Пример 1

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.pardir, 'new_dir'))

Пример 2

import os
print os.makedirs(os.path.join(os.path.dirname(__file__), os.path.abspath('..'), 'new_dir'))

Ответ 17

os.path.abspath('D:\Dir1\Dir2\..')

>>> 'D:\Dir1'

Итак, .. помогает

Ответ 18

import os

def parent_filedir(n):
    return parent_filedir_iter(n, os.path.dirname(__file__))

def parent_filedir_iter(n, path):
    n = int(n)
    if n <= 1:
        return path
    return parent_filedir_iter(n - 1, os.path.dirname(path))

test_dir = os.path.abspath(parent_filedir(2))

Ответ 19

Ответы, приведенные выше, отлично подходят для перехода на один или два уровня каталогов, но они могут стать немного громоздкими, если нужно пройти дерево каталогов на многих уровнях (например, 5 или 10). Это можно сделать кратко, присоединив список N os.pardir в os.path.join. Пример:

import os
# Create list of ".." times 5
upup = [os.pardir]*5
# Extract list as arguments of join()
go_upup = os.path.join(*upup)
# Get abspath for current file
up_dir = os.path.abspath(os.path.join(__file__, go_upup))

Ответ 20

Если вы хотите получить более практичное решение, вы можете сделать следующий вариант:

path="/home/a/c/c.txt" 
path.rsplit("/", 1)[0]
Out[33]: '/home/a/c'