Making a path object with pathlib
module like:
p = pathlib.Path('file.txt')
The p
object will point to some file in the filesystem, since I can do for example p.read_text()
.
How can I get the absolute path of the p
object in a string?
Appears that I can use for example os.path.abspath(p)
to get the absolute path, but it awkward to use an os.path
method, since I assume that pathlib
should be a replacement for os.path
.
The pathlib is a Python module which provides an object API for working with files and directories. The pathlib is a standard module. Path is the core object to work with files.
parts : returns a tuple that provides access to the path's components. name : the path component without any directory. parent : sequence providing access to the logical ancestors of the path. stem : final path component without its suffix.
pathlib. Path (WindowsPath, PosixPath, etc.) objects are not considered PathLike : PY-30747.
resolve()
Simply use Path.resolve()
like this:
p = p.resolve()
This makes your path absolute and replaces all relative parts with absolute parts, and all symbolic links with physical paths. On case-insensitive file systems, it will also canonicalize the case (file.TXT
becomes file.txt
).
absolute()
You should not use absolute()
because it's not documented, untested, and considered for removal. (See the discussion in the bug report created by @Jim Fasarakis Hilliard).
The difference between resolve
and absolute
is that absolute()
does not replace the symbolically linked (symlink) parts of the path, and it never raises FileNotFoundError
. It does not modify the case either.
If you want to avoid resolve()
(e.g. you want to retain symlinks, casing, or relative parts) then use this instead:
p = Path.cwd() / "file.txt"
This works even if the path you are supplying is absolute -- in that case the cwd
(current working directory) is ignored.
If the file does not exist, in Python 3.6 to 3.9 on Windows, resolve()
does not prepend the current working directory. See issue 38671, fixed in Python 3.10.
On Python versions predating v3.6, resolve()
does raise a FileNotFoundError
if the path is not present on disk.
So if there's any risk to that, either check beforehand with p.exists()
or try/catch the error.
# check beforehand if p.exists(): p = p.resolve() # or except afterward try: p = p.resolve() except FileNotFoundError: # deal with the missing file here pass
If you're dealing with a path that's not on disk, to begin with, and you're not on Python 3.6+, it's best to revert to os.path.abspath(str(p))
.
From 3.6 on, resolve()
only raises FileNotFoundError
if you use the strict
argument.
# might raise FileNotFoundError p = p.resolve(strict=True)
But beware, using strict
makes your code incompatible with Python versions predating 3.6 since those don't accept the strict
argument.
Follow issue 39090 to follow documentation changes related to absolute()
.
You're looking for the method .absolute
, if my understanding is correct, whose documentation states:
>>> print(p.absolute.__doc__) Return an absolute version of this path. This function works even if the path doesn't point to anything. No normalization is done, i.e. all '.' and '..' will be kept along. Use resolve() to get the canonical path to a file.
With a test file on my system this returns:
>>> p = pathlib.Path('testfile') >>> p.absolute() PosixPath('/home/jim/testfile')
This method seems to be a new, and still, undocumented addition to Path
and Path
inheritting objects.
Created an issue to document this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With