Нормализовать несуществующий путь с помощью только pathlib

python недавно добавил модуль pathlib (который мне очень нравится!).

есть одна вещь, с которой я борюсь: возможно ли нормализовать путь к файлу или директории, которая не существует? Я отлично справляюсь с os.path.normpath. но не было бы абсурдом использовать что-то другое, кроме библиотеки, которая должна заботиться о материалах, связанных с путями?

функциональность, которую я хотел бы иметь, таков:

from os.path import normpath
from pathlib import Path
pth = Path('/tmp/some_directory/../i_do_not_exist.txt')
pth = Path(normpath(str(pth)))
# -> /tmp/i_do_not_exist.txt

но без необходимости прибегать к os.path и без ввода типа str и обратно в Path. также pth.resolve() не работает для несуществующих файлов.

существует простой способ сделать это с помощью только pathlib?

3 ответа

Можно ли нормализовать путь к файлу или директории, которая не существует?

Начиная с версии 3.6, это поведение по умолчанию. См. https://docs.python.org/3.6/library/pathlib.html#pathlib.Path.resolve

Path. Решимость (нечеткое = False) ... Если strict - False, путь разрешается как можно дальше, и любой остаток добавляется, не проверяя, существует ли он


Как и у Python 3.5: Нет, нет.

PEP 0428 утверждает:

Разрешение пути

Метод resolve() делает путь абсолютным, разрешая любая символическая ссылка на пути (например, вызов POPIX realpath()). Это только операция, которая удалит компоненты пути ".." . В Windows, этот метод также позаботится о возвращении канонического пути (с правый корпус).

Так как resolve() является единственной операцией для удаления компонентов "..", и она не работает, когда файл не существует, не будет простого средства, используя только pathlib.

Кроме того, документация pathlib дает подсказку, почему:

Ломаная косая черта и одиночные точки свертываются, но двойные точки ('..') нет, поскольку это изменит значение пути в символические ссылки:

PurePath('foo//bar') производит PurePosixPath('foo/bar')

PurePath('foo/./bar') создает PurePosixPath('foo/bar')

PurePath('foo/../bar') производит PurePosixPath('foo/../bar')

(наивный подход сделал бы PurePosixPath ('foo/../bar') эквивалентным PurePosixPath ('bar'), что неверно, если foo является символической ссылкой на другой каталог)

Все, что было сказано, вы могли бы создать файл с 0 байтами в месте вашего пути, а затем можно было бы разрешить путь (таким образом, исключая..). Я не уверен, что любой более простой, чем ваш подход к нормальному пути.


Если это вам подходит, например, если каталог ifle уже существует, вы можете попробовать resolve родительский путь пути, а затем повторно добавить имя файла, например:

from pathlib import Path
p = Path()/'hello.there'
print(p.parent.resolve()/p.name)

licensed under cc by-sa 3.0 with attribution.