Разделение компонентов DOS пути в Python: способы и методы

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Хотите разобрать DOS-путь на отдельные части с помощью Python? Вам поможет модуль os.path. У функции os.path.splitdrive() стоит задача выделить имя диска. После этого применяйте os.path.split() в цикле, чтобы отделить все оставшиеся компоненты пути:

Python
Скопировать код
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(), подав на вход нужный путь.

Кинга Идем в IT: пошаговый план для смены профессии

Pathlib: Cовременный подход

Если в DOS-пути присутствуют обратные слеши, рекомендуется задавать путь в формате raw-строки. В качестве альтернативы вы можете использовать библиотеку pathlib, которая добавлена в Python начиная с версии 3.4:

Python
Скопировать код
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() поможет обработать как абсолютные, так и относительные пути. Она проверяет, начинается ли путь с имени диска:

Python
Скопировать код
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

Полезные материалы

  1. os.path — Основные операции с путями файлов — Документация Python 3
  2. pathlib — Объектно-ориентированный подход к путям файловой системы — Документация Python 3
  3. Текущее обсуждение на Stack Overflow по теме работы с путями
  4. Библиотека pathlib в Python: Как справиться с файловой системой – Real Python
  5. Статья на Medium о библиотеке pathlib в Python
  6. Обучающий Python курс, который может затронуть вопросы обработки путей