Извлечь часть пути к файлу (каталог) в Python

Мне нужно извлечь имя родительского каталога определенного пути. Вот как это выглядит:

C:\stuff\directory_i_need\subdir\file.jpg

Я хочу извлечь directory_i_need.


person Thalia    schedule 13.04.2012    source источник
comment
Возможно, вы захотите проверить этот ответ: stackoverflow.com/a/4580931/311220   -  person Acorn    schedule 14.04.2012
comment
Приведенная выше ссылка помогла мне понять, как исправить то, что я сделал не так. Спасибо.   -  person Thalia    schedule 14.04.2012
comment
или этот: stackoverflow.com/a/31273488/1048186   -  person Josiah Yoder    schedule 20.06.2018


Ответы (7)


import os
## first file in current dir (with full path)
file = os.path.join(os.getcwd(), os.listdir(os.getcwd())[0])
file
os.path.dirname(file) ## directory of file
os.path.dirname(os.path.dirname(file)) ## directory of directory of file
...

И вы можете продолжать делать это сколько угодно раз ...

Изменить: из os.path можно использовать либо os.path.split, либо os.path.basename:

dir = os.path.dirname(os.path.dirname(file)) ## dir of dir of file
## once you're at the directory level you want, with the desired directory as the final path node:
dirname1 = os.path.basename(dir) 
dirname2 = os.path.split(dir)[1] ## if you look at the documentation, this is exactly what os.path.basename does.
person Nisan.H    schedule 13.04.2012
comment
Он действительно извлекает части пути, но я не знаю, как извлечь фактическое имя каталога из пути. - person Thalia; 14.04.2012
comment
+1: сценарий, в котором os.path.dirname(path) удобно по сравнению с pathlib.Path(path).parent: вам дается строка path. Вы хотите создать каталог для path, если он не существует, независимо от того, является ли сам path каталогом или нет. Например, path может быть /home/me/directory_to_create/file_to_create.txt или /home/me/directory_to_create/. Во втором случае pathlib.Path(path).parent возвращает /home/me/, что нежелательно. - person r.beigi; 30.03.2021

Для Python 3.4+ попробуйте pathlib module:

>>> from pathlib import Path

>>> p = Path('C:\\Program Files\\Internet Explorer\\iexplore.exe')

>>> str(p.parent)
'C:\\Program Files\\Internet Explorer'

>>> p.name
'iexplore.exe'

>>> p.suffix
'.exe'

>>> p.parts
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

>>> p.relative_to('C:\\Program Files')
WindowsPath('Internet Explorer/iexplore.exe')

>>> p.exists()
True
person Noam Manos    schedule 19.01.2016
comment
хорошая демонстрация API - person Nadim Farhat; 24.01.2017
comment
Это также было перенесено в более старые версии Python: pathlib2 - person phoenix; 23.09.2017
comment
Ваш пример неверен, если ваш путь содержит, например, \ a. вы должны добавить r перед строкой пути. - person maugch; 09.09.2020

Все, что вам нужно, это parent часть, если вы используете pathlib.

from pathlib import Path
p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parent) 

Выведет:

C:\Program Files\Internet Explorer    

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

p = Path(r'C:\Program Files\Internet Explorer\iexplore.exe')
print(p.parts) 

Тогда вы получите список:

('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')

Экономит время.

person prosti    schedule 31.05.2019

Сначала проверьте, есть ли у вас splitunc() в качестве доступной функции в os.path. Первый возвращенный элемент должен быть тем, что вы хотите ... но я работаю в Linux, и у меня нет этой функции, когда я импортирую os и пытаюсь ее использовать.

В противном случае, один из полу-уродливых способов выполнить свою работу - это использовать:

>>> pathname = "\\C:\\mystuff\\project\\file.py"
>>> pathname
'\\C:\\mystuff\\project\\file.py'
>>> print pathname
\C:\mystuff\project\file.py
>>> "\\".join(pathname.split('\\')[:-2])
'\\C:\\mystuff'
>>> "\\".join(pathname.split('\\')[:-1])
'\\C:\\mystuff\\project'

который показывает получение каталога чуть выше файла и каталога чуть выше него.

person ely    schedule 13.04.2012
comment
Я отредактировал свою запись, чтобы показать использование rsplit, который выполняет то, что вы предлагаете, но все же дает мне путь, а не только имя каталога. - person Thalia; 14.04.2012
comment
Я все еще не понимаю, о чем вы спрашиваете. Почему бы вам тогда не удалить все, что находится слева от следующего более высокого экземпляра \\? Представьте, что вам нужен путь, а затем просто сохраните последнюю запись, когда вы разделите его на \\. Это должно сработать, не так ли? - person ely; 14.04.2012
comment
В итоге я разделил путь и взял то, что хотел, раньше это не сработало, но после прочтения всех этих ответов я понял, что я сделал не так. - person Thalia; 14.04.2012
comment
Если чтение ответов вам помогло, подумайте о том, чтобы проголосовать за них по крайней мере и, возможно, принять один из них. Я рад, что вы заметили ошибку. - person ely; 14.04.2012
comment
Мне нравится, как работает этот наполовину уродливый способ. Я меняю \\ с помощью простого os.sep, и он отлично работает, чтобы получить только часть пути. - person TazgerO; 08.10.2012

import os

directory = os.path.abspath('\\') # root directory
print(directory) # e.g. 'C:\'

directory = os.path.abspath('.') # current directory
print(directory) # e.g. 'C:\Users\User\Desktop'

parent_directory, directory_name = os.path.split(directory)
print(directory_name) # e.g. 'Desktop'
parent_parent_directory, parent_directory_name = os.path.split(parent_directory)
print(parent_directory_name) # e.g. 'User'

Это тоже должно помочь.

person Basti Würzburg    schedule 07.02.2020

Вот что я сделал, чтобы извлечь часть каталога:

for path in file_list:
  directories = path.rsplit('\\')
  directories.reverse()
  line_replace_add_directory = line_replace+directories[2]

Спасибо за помощь.

person Thalia    schedule 16.04.2012

Вы должны указать весь путь как параметр в os.path.split. См. Документы. Это не работает как разделение строк.

person Keith    schedule 13.04.2012
comment
Это не будет работать с именами путей типа UNC в Windows, как указано в документации Python для файлов os.path. - person ely; 14.04.2012