2021-02-08 12:00:15
Как быстро отрезать от пути несколько элементов с любой стороны?
Например, есть длинный путь:
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
1.5K views09:00