Нормализовать несуществующий путь с помощью только 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. <span> Решимость</span> (нечеткое = False) ... Если <code>strict</code> - <code>False</code>, путь разрешается как можно дальше, и любой остаток добавляется, не проверяя, существует ли он


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

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

<h2> Разрешение пути</h2>

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

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

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

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

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

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

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

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

Все, что было сказано, вы могли бы создать файл с 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.