Разделение компонентов DOS пути в Python: способы и методы
Быстрый ответ
Хотите разобрать DOS-путь на отдельные части с помощью Python? Вам поможет модуль os.path
. У функции os.path.splitdrive()
стоит задача выделить имя диска. После этого применяйте os.path.split()
в цикле, чтобы отделить все оставшиеся компоненты пути:
import os
def split_dos_path(path):
parts = []
drive, path = os.path.splitdrive(path)
while path:
path, tail = os.path.split(path)
parts.append(tail)
parts.append(drive)
return list(filter(None, parts[::-1]))
components = split_dos_path("C:\\Dir\\Subdir\\file.ext")
print(components) # Вывод: ['C:', 'Dir', 'Subdir', 'file.ext']
Чтобы получить список компонентов, достаточно вызвать функцию split_dos_path()
, подав на вход нужный путь.
Pathlib: Cовременный подход
Если в DOS-пути присутствуют обратные слеши, рекомендуется задавать путь в формате raw-строки. В качестве альтернативы вы можете использовать библиотеку pathlib
, которая добавлена в Python начиная с версии 3.4:
from pathlib import Path, PureWindowsPath
def split_dos_path_pathlib(path):
path = PureWindowsPath(path)
return path.parts
components = split_dos_path_pathlib(r"C:\Dir\Subdir\file.ext")
print(components) # Вывод: ('C:\\', 'Dir', 'Subdir', 'file.ext')
Pathlib
значительно упрощает работу со специальными символами и возвращает элементы пути в формате кортежа.
Обработка абсолютных и относительных путей: одна функция для всех случаев
Функция os.path.isabs()
поможет обработать как абсолютные, так и относительные пути. Она проверяет, начинается ли путь с имени диска:
import os
def split_dos_path_all(path):
parts = []
if os.path.isabs(path):
drive, path = os.path.splitdrive(path)
parts.append(drive)
while path:
path, tail = os.path.split(path)
parts.append(tail)
return list(filter(None, parts[::-1]))
print(split_dos_path_all(r"C:\Dir\Subdir\file.ext")) # Абсолютный путь
print(split_dos_path_all(r"Dir\Subdir\file.ext")) # Относительный путь
Визуализация
Процесс разделения DOS-пути можно визуализировать как работу нескольких инструментов, каждый из которых выполняет свою функцию:
os.path.splitdrive()
выделяет имя диска ('C:').os.path.dirname()
извлекает директорию ('\Windows\System32').os.path.basename()
получает название файла ('calc.exe').os.path.split()
разделяет путь на части ('\Windows\System32' и 'calc.exe').os.path.splitext()
отделяет имя файла от его расширения ('calc' и '.exe').
Используя все эти функции вместе, вы с легкостью разобьете DOS-путь на компоненты.
Остерегаемся проблем с путями
Для обеспечения корректности DOS-путей используйте функцию os.path.normpath()
, которая поможет избежать неожиданных проблем с обратными слешами и двоеточиями. Для работы с кодом, созданным для Python 2, может пригодиться pathlib2
. Обратные слеши также стоит задавать в формате raw-строк (r'path\to\file'
) для предотвращения ошибок.
История двух библиотек для работы с путями
Выбор между os.path
и pathlib
зависит от версии Python и предпочтений в написании кода. os.path
идеально подходит для старых версий Python, тогда как pathlib
применяется для современного подхода к работе с файловой системой:
- Python версии ≤ 2.x: предпочтительнее
os.path
- Python версии ≥ 3.4: предпочтительнее
pathlib
Полезные материалы
- os.path — Основные операции с путями файлов — Документация Python 3
- pathlib — Объектно-ориентированный подход к путям файловой системы — Документация Python 3
- Текущее обсуждение на Stack Overflow по теме работы с путями
- Библиотека pathlib в Python: Как справиться с файловой системой – Real Python
- Статья на Medium о библиотеке pathlib в Python
- Обучающий Python курс, который может затронуть вопросы обработки путей