Витягніть частину файлового шляху (каталогу) в Python


162

Мені потрібно витягнути ім’я батьківського каталогу певного шляху. Ось як це виглядає:

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
Жолудь

Наведене вище посилання допомогло мені зрозуміти, як виправити те, що я зробив неправильно. Дякую.
Талія

Відповіді:


237
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
Надім Фархат

Це також було підкріплено
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
Мені все одно не зрозуміло, про що ви питаєте. Чому б тоді не зняти все ліворуч від наступної вищої інстанції \\? Зробіть вигляд, що хочете шлях, тоді просто збережіть останній запис, коли ви розділите його на \\. Це має працювати, ні?
ely

Я закінчила розбивати шлях і взяла потрібний фрагмент, раніше він не працював, але прочитавши всі ці відповіді, я з’ясував, що я зробив не так.
Талія

Якщо читання відповідей допомогло вам, подумайте, принаймні, проголосуйте їх і, можливо, прийняти одну з них. Я радий, що ти помітив помилку.
ely

Мені подобається, як працює цей напівпотворний спосіб. Я змінюю "\\" простим 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.
ely
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.