normalize non-existing path using pathlib only normalize non-existing path using pathlib only python-3.x python-3.x

normalize non-existing path using pathlib only


is it possible to normalize a path to a file or directory that does not exist?

Starting from 3.6, it's the default behavior. See https://docs.python.org/3.6/library/pathlib.html#pathlib.Path.resolve

Path.resolve(strict=False)
...
If strict is False, the path is resolved as far as possible and any remainder is appended without checking whether it exists


As of Python 3.5: No, there's not.

PEP 0428 states:

Path resolution

The resolve() method makes a path absolute, resolving any symlink on the way (like the POSIX realpath() call). It is the only operation which will remove " .. " path components. On Windows, this method will also take care to return the canonical path (with the right casing).

Since resolve() is the only operation to remove the ".." components, and it fails when the file doesn't exist, there won't be a simple means using just pathlib.

Also, the pathlib documentation gives a hint as to why:

Spurious slashes and single dots are collapsed, but double dots ('..') are not, since this would change the meaning of a path in the face of symbolic links:

PurePath('foo//bar') produces PurePosixPath('foo/bar')

PurePath('foo/./bar') produces PurePosixPath('foo/bar')

PurePath('foo/../bar') produces PurePosixPath('foo/../bar')

(a naïve approach would make PurePosixPath('foo/../bar') equivalent to PurePosixPath('bar'), which is wrong if foo is a symbolic link to another directory)

All that said, you could create a 0 byte file at the location of your path, and then it'd be possible to resolve the path (thus eliminating the ..). I'm not sure that's any simpler than your normpath approach, though.


If this fits you usecase(e.g. ifle's directory already exists) you might try to resolve path's parent and then re-append file name, e.g.:

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