Как получить относительные пути с помощью Pathlib - PullRequest
1 голос
/ 05 мая 2020

Я начал использовать from pathlib import Path вместо os.path.join() для объединения моих путей. Принимая во внимание следующий код:

from pathlib import Path
import cv2

rootfolder = "rootyrooty"
file = "alittlefile"
image_path = Path(rootfolder, file)
image = cv2.imread(image_path.as_posix())

Я использую image_path.as_posix() для получения полной строки, поэтому я могу передать image_path в функцию imread. Прямой ввод image_path не работает, поскольку он возвращает WindowsPath('rootyrooty/alittlefile'), но мне нужно "rootyrooty/alittlefile" (поскольку imread принимает строки вместо объектов windowsPath). Должен ли я использовать другой компонент из pathlib вместо Path, чтобы я мог просто передать image_path в функцию imread. Нравится:

from pathlib import thefunctionyetidontknow
image_path = thefunctionyetidontknow("rootyrooty","alittlefile")
print("image_path")
# returns "rootyrooty/alittlefile"

Спасибо.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

То, как вы комбинируете пути, прекрасно. Что вызывает сомнения, так это использование as_posix() на машине Windows. Некоторые библиотеки, которые принимают строку в качестве пути, могут хорошо работать с разделителями путей posix, но вместо этого может быть предпочтительнее использовать разделитель os. Чтобы получить путь с разделителями файловой системы, используйте str.

См. https://docs.python.org/3/library/pathlib.html

Строковое представление пути - это сам необработанный путь файловой системы ( в исходной форме, например, с обратной косой чертой под Windows), которую вы можете передать любой функции, принимающей путь к файлу в виде строки:

>> p = PurePath('/etc')
>> str(p)
'/etc'
>> p = PureWindowsPath('c:/Program Files')
>> str(p)
'c:\\Program Files'
1 голос
/ 05 мая 2020

Вы можете преобразовать объект Path в строку с помощью встроенной функции str Python:

from pathlib import Path
import cv2

rootfolder = "rootyrooty"
file = "alittlefile"
image_path = Path(rootfolder, file)
image = cv2.imread(str(image_path))
...