Получи случайную криптовалюту за регистрацию!

Как быстро отрезать от пути несколько элементов с любой сторон | Python Заметки

Как быстро отрезать от пути несколько элементов с любой стороны?
Например, есть длинный путь:

path = '/home/user/projects/proj1/assets/assetname/geo/publish/v001/body.geo'

Для удобного отображения логов (или еще какой-то абстрактной задачи) я хочу видеть только 3 последних элемента.

Сейчас мы не будем усложнять задачу с выделением только нужных элементов с парсингом самой строки. Работаем только с индексами элементов.
Учитываем, что путь может прийти с неизвестно куда направленными слешами.
Хочу реализацию в одну строку

Вот так можно это сделать с помощью модуля os.path

>>> os.path.join(
... *os.path.normpath(
... path
... ).replace(
... '\\', '/'
... ).split('/')[-3:])
'publish/v001/body.geo'

Монструозно, но работает

Более красивый вариант это класс pathlib.Path.
У него есть две функции, которые нам помогут

Свойство parts, которое возвращает список элементов пути.
Конструктор Path() может принимать несколько строк которые объединятся в один путь. То есть аналогично функции join.

>>> Path('folder', 'file')
PosixPath('folder/file')

Поэтому мы можем сделать так:

>>> Path(*Path(path).parts[-5:])
PosixPath('publish/v001/body.geo')

Ну вот, более лаконично (питонично )
А еще можно вырезать середину, оставив начало и конец

>>> p = Path(path)
>>> Path(*p.parts[:3],'...', *p.parts[-2:])
PosixPath('/home/user/.../v001/body.geo')

#tricks #libs