2012-04-13 2 views
72

Мне нужно извлечь имя родительского каталога определенного пути. Вот как это выглядит: c:\ stuff \ directory_i_need \ subdir \ file. Я изменяю содержимое «файла» тем, что использует в нем имя directory_i_need (а не путь). Я создал функцию, которая даст мне список всех файлов, а затем ...Извлечь часть пути к файлу (каталог) в Python

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

Вы можете проверить этот ответ из: http://stackoverflow.com/a/4580931/311220 – Acorn

+0

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

ответ

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

И вы можете продолжать делать это столько раз, сколько необходимо ...

Edit: из 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. 
+0

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

+1

Я редактировал сообщение, чтобы включить извлечение имени каталога. –

-1

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

+0

Это не будет работать на пути UNC-типа в Windows, как документы Python для состояния os.path. – ely

4

Во-первых, посмотрите, есть ли у вас 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' 

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

+0

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

+1

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

+0

Я закончил тем, что раскалывал путь и брал кусок, который хотел, он не работал раньше, но после прочтения всех этих ответов я узнал, что я сделал не так. – Thalia

1

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

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

Благодарим за помощь.

12

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

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

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

+0

Это также было обращено к более старым версиям Python: [pathlib2] (https://pypi.python.org/pypi/pathlib2/) – phoenix

Смежные вопросы