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


163

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

c:\stuff\directory_i_need\subdir\file

Я изменяю содержимое «файла», используя в нем directory_i_needимя, а не путь. Я создал функцию, которая выдаст мне список всех файлов, а затем ...

for path in file_list:
   #directory_name = os.path.dirname(path)   # this is not what I need, that's why it is commented
   directories, files = path.split('\\')

   line_replace_add_directory = line_replace + directories  
   # this is what I want to add in the text, with the directory name at the end 
   # of the line.

Как я могу это сделать?


1
Вы можете проверить этот ответ: stackoverflow.com/a/4580931/311220
Желудь

Приведенная выше ссылка помогла мне понять, как исправить то, что я сделал не так. Спасибо.
Талия

Ответы:


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

Он извлекает части пути, но я не знаю, как извлечь из пути фактическое имя каталога.
Талия

43

В Python 3.4 вы можете использовать модуль pathlib :

>>> from pathlib import Path
>>> p = Path('C:\Program Files\Internet Explorer\iexplore.exe')
>>> p.name
'iexplore.exe'
>>> p.suffix
'.exe'
>>> p.root
'\\'
>>> p.parts
('C:\\', 'Program Files', 'Internet Explorer', 'iexplore.exe')
>>> p.relative_to('C:\Program Files')
WindowsPath('Internet Explorer/iexplore.exe')
>>> p.exists()
True

хорошая демонстрация API
Надим Фархат

Это также было перенесено в более старые версии Python: pathlib2
phoenix

11

Все, что вам нужно, это 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')

Сохраняет тонус времени.


5

Сначала посмотрите, есть ли у вас 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'

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


Я отредактировал свою запись, чтобы показать использование rsplit, который делает то, что вы предлагаете, но все же дает мне путь, а не только имя каталога.
Талия

1
Мне все еще не ясно, о чем ты спрашиваешь. Почему бы вам не раздеть все слева от следующего более высокого экземпляра \\ тогда? Сделайте вид, что вы хотите путь, а затем просто оставьте последнюю запись этого, когда вы разделите его на \\. Это должно работать, нет?
Илай

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

Если чтение ответов действительно помогло вам, подумайте хотя бы об их повторном голосовании и, возможно, о принятии одного из них. Я рад, что вы заметили ошибку.
Илай

Мне нравится, как этот полу-уродливый способ работает. Я изменяю "\\" простым os.sep, и он отлично работает, чтобы получить только часть пути.
TazgerO

1

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

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

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


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

Это также должно сделать свое дело.


-1

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


Это не будет работать с путевыми именами типа UNC в Windows, так как документация Python для состояния os.path.
Илай
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.