Странное поведение пути при использовании os.path и pathlib Ma c OSX Catalina - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть изображение с именем image1.png, его реальный путь на моем macbook:

/ Users / emadboctor / Desktop / images / image1.png

и изображение найдено по телефону:

images = os.listdir('/Users/emadboctor/Desktop/images/image1.png')

Допустим, я хочу получить тот же путь выше, позвонив

os.path.abspath(images[0])

или

pathlib.Path(images[0]).absolute()

и текущий рабочий каталог:

/Users/emadboctor/Desktop/another

Ожидаемый путь: /Users/emadboctor/Desktop/images/image1.png

Что я на самом деле получаю: /Users/emadboctor/Desktop/another/image1.png

Чтобы воспроизвести проблему, вот последовательность шагов:

>>> import os
>>> os.getcwd()
'/Users/emadboctor/Desktop/another'
>>> os.path.abspath('../images/image1.png')
'/Users/emadboctor/Desktop/images/image1.png'  # This is the correct/expected path
>>> os.listdir('../images')
['image1.png']
>>> images = [os.path.abspath(image) for image in os.listdir('../images')]
>>> images
['/Users/emadboctor/Desktop/another/image1.png']  # This is the unexpected/incorrect path
>>> import pathlib
>>> pathlib.Path('../images/image1.png').parent.absolute()
PosixPath('/Users/emadboctor/Desktop/another/../images')  # This is also the unexpected/incorrect path

Как получить ожидаемый путь без жесткого кодирования правильного префикса?

[f'/Users/emadboctor/Desktop/images/{image}' for image os.listdir('../images')]

1 Ответ

1 голос
/ 20 апреля 2020

Используйте функцию resolve.

>>> from pathlib import Path
>>>
>>> Path.cwd()
WindowsPath('d:/Docs/Notes/Notes')
>>> p = Path('../../test/lab.svg')
>>> p
WindowsPath('../../test/lab.svg')
>>> p.absolute()
WindowsPath('d:/Docs/Notes/Notes/../../test/lab.svg')
>>> p.absolute().resolve()
WindowsPath('D:/Docs/test/lab.svg')
...