Как обрезать путь к файлу?
У меня есть переменная
import os
way = os.path.dirname(os.path.abspath(__file__))
Которая возвращает
D:\Project\window\python\test\apps\
C:\Folder\Project\window\python\test2\anon\
I:\Test\Project\Block\image\
D:\Project\windows\python\Project\content\
Я хочу обработать ее что бы она мне возвращала
D:\Project\
C:\Folder\Project\
I:\Test\Project\
D:\Project\
Ответы (3 шт):
Автор решения: Pavel Durmanov
→ Ссылка
In [147]: import pathlib
In [148]: path = pathlib.PosixPath("some/very/long/path")
In [149]: list(path.parents)
Out[149]:
[PosixPath('some/very/long'),
PosixPath('some/very'),
PosixPath('some'),
PosixPath('.')]
Дальше по индексу выбирайте нужый путь. На Windows вместо PosixPath - WindowsPath.
Автор решения: S. Nick
→ Ссылка
Как вариант:
paths = [
'D:\\Project\\window\\python\\test\\apps\\',
'C:\\Folder\\Project\\window\\python\\test2\\anon\\',
'I:\\Test\\Project\\Block\\image\\',
'D:\\Project\\windows\\python\\Project\\content\\',
'D:\\roject\\windows\\python\\froject\\content\\',
]
for path in paths:
start = path.find('Project\\')
if start != -1: print(path[:start+8])
Update
paths = [
'D:\\Project\\window\\python\\test\\apps\\',
'C:\\Folder\\Project\\window\\python\\test2\\anon\\',
'I:\\Test\\Project\\Block\\image\\',
'D:\\Project\\windows\\python\\Project\\content\\',
'F:\\PyProject\\windows\\python\\fProject\\content\\',
]
for path in paths:
start = path.find('\\Project\\')
if start != -1: print(path[:start+9])
Автор решения: insolor
→ Ссылка
Рабочий пример с pathlib:
import pathlib
paths = [
'D:\\Project\\window\\python\\test\\apps\\',
'C:\\Folder\\Project\\window\\python\\test2\\anon\\',
'I:\\Test\\Project\\Block\\image\\',
'D:\\Project\\windows\\python\\Project\\content\\',
'D:\\roject\\windows\\python\\froject\\content\\',
]
def get_project_root(path_string):
# pathlib.PureWindowsPath вместо pathlib.Path нужно чтобы
# пример c Windows-путями работал под Linux
# Если вашем в скрипте обрабатываются нативные для вашей системы пути,
# можно использовать просто pathlib.Path
path = pathlib.PureWindowsPath(path_string)
# Если в пути нет Project, то выходим
if 'Project' not in path.parts:
return None
# Находим, в каком куске пути по счету от начала находится первый Project:
index = path.parts.index('Project')
# Берем все части пути до Project включительно, собираем из них новый путь
return PureWindowsPath(*path.parts[:index+1])
for p in paths:
print(get_project_root(p))
Вывод:
D:\Project
D:\Project\windows
D:\Project\windows
D:\Project
None
Аналогичная функция, но работающая с путями просто как со строками:
def get_project_root(path_string, sep='\\'):
parts = path_string.split(sep)
if 'Project' not in parts:
return None
index = parts.index('Project')
return sep.join(parts[:index+1])
