Для этого в модуле os.path
ничего не существует. Каждый так часто кто-то предлагает создать функцию splitall
, которая возвращает список (или итератор) всех компонентов, но он никогда не получал достаточного сцепления.
Отчасти это связано с тем, что каждый раз, когда кто-либо предлагал добавить новую функциональность в os.path
, он вновь зажег давнюю неудовлетворенность общим дизайном библиотеки, что привело к тому, что кто-то предложил новый, более OO-подобный API для пути к устареванию os, clunky API. В 3.4 это, наконец, произошло, с pathlib
. И у этого уже есть функциональность, которой не было в os.path
. Итак:
>>> p = pathlib.Path('/First/Second/Third/Fourth/Fifth')
>>> p.parts[2:]
('Third', 'Fourth', 'Fifth')
>>> pathlib.Path(*p.parts[2:])
PosixPath('Second/Third/Fourth/Fifth')
Или ... вы уверены, что действительно хотите удалить первый компонент, а не сделать это?
>>> p.relative_to(*p.parts[:2])
PosixPath('Second/Third/Fourth/Fifth')
Если вам нужно сделать, это в 2,6-2,7 или 3,2-3,3, есть backport of pathlib
.
Конечно, вы можете использовать манипуляции с строкой, если вы стараетесь нормализовать путь и используете os.path.sep
, а также убедитесь, что вы обрабатываете детали с непрямыми путями или системами с буквами диска и ...
Или вы можете просто обернуть свой рекурсивный os.path.split
. Что именно «неоптимально» об этом, как только вы его завершите? Это может быть немного медленнее, но мы говорим о наносекундах здесь, на несколько порядков быстрее, чем даже вызов stat
на файл. У него будут проблемы с глубиной рекурсии, если у вас есть файловая система с тысячами каталогов, но вы когда-нибудь видели ее? (Если это так, вы всегда можете превратить его в цикл ...) Это займет несколько минут, чтобы обернуть его и написать хорошие модульные тесты, но это то, что вы делаете только один раз и больше не волнуетесь. Итак, честно говоря, если вы не хотите использовать pathlib
, вот что я буду делать.
'pathlib' dosent поставляется с python, необходимо установить его – Hackaholic
по производительности вы совершенно правы: мы говорим о наносекундах; это больше я пытаюсь выучить наилучший способ/другие способы сделать это. – meto
@Hackaholic: В ответ объясняется подробно, 'pathlib' поставляется с Python 3.4+, и вы можете установить backport для 2.6-2.7 или 3.2-3.3 , – abarnert