Как определить относительный путь относительно любого каталога - PullRequest
2 голосов
/ 22 октября 2019

Я знаю, как разрешить относительный путь, например '..\input\file\hello.txt', в абсолютный путь относительно текущего рабочего каталога:

from pathlib import Path

rel_path = Path(r'..\input\file\hello.txt')
print(f'Absolute path: {rel_path.absolute()}'

Вывод, если cwd равно C:\project\source\:

C:\project\source\..\input\file\hello.txt

И я также использовал .resolve() для полного разрешения косвенных указаний:

from pathlib import Path

rel_path = Path(r'..\input\file\hello.txt')
print(f'Resolved path: {rel_path.resolve()}'

Вывод, когда cwd равен C:\project\source\:

C:\project\input\file\hello.txt

Как я могу разрешить путь относительно любого пути без изменения текущего рабочего каталога (если он вообще есть)? И даже когда мне нужно изменить текущий рабочий каталог, как я могу полностью разрешить путь, который на самом деле не существует? (поскольку .resolve() работает только для существующих объектов)

Например, использование мнимого get_relative_to():

get_relative_to(r'..\input\file\hello.txt', r'X:\bogus\folder')

в идеале вернет 'X:\bogus\input\file\hello.txt'

1 Ответ

0 голосов
/ 22 октября 2019

Начиная с версии 3.6 resol имеет аргумент strict, когда strict=False путь может быть разрешен, даже если он не существует. Пример, протестированный в 3.8.0:

from pathlib import Path


def get_relative_to(path1, path2):
    return (path2 / path1).resolve(strict=False)


print(
    get_relative_to(
        Path(r'..\input\file\hello.txt'),
        Path(r'X:\bogus\folder'),
    )
)

# X:\bogus\input\file\hello.txt
...