Как получить родительский каталог в 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'