pathlib — Object-oriented filesystem paths¶
Added in version 3.4.
Source code: Lib/pathlib/
This module offers classes representing filesystem paths with semantics appropriate for different operating systems. Path classes are divided between pure paths, which provide purely computational operations without I/O, and concrete paths, which inherit from pure paths but also provide I/O operations.
If you’ve never used this module before or just aren’t sure which class is
right for your task, Path is most likely what you need. It instantiates
a concrete path for the platform the code is running on.
Pure paths are useful in some special cases; for example:
If you want to manipulate Windows paths on a Unix machine (or vice versa). You cannot instantiate a
WindowsPathwhen running on Unix, but you can instantiatePureWindowsPath.You want to make sure that your code only manipulates paths without actually accessing the OS. In this case, instantiating one of the pure classes may be useful since those simply don’t have any OS-accessing operations.
See also
PEP 428: The pathlib module – object-oriented filesystem paths.
See also
For low-level path manipulation on strings, you can also use the
os.path module.
Basic use¶
Importing the main class:
>>> from pathlib import Path
Listing subdirectories:
>>> p = Path('.')
>>> [x for x in p.iterdir() if x.is_dir()]
[PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
PosixPath('__pycache__'), PosixPath('build')]
Listing Python source files in this directory tree:
>>> list(p.glob('**/*.py'))
[PosixPath('test_pathlib.py'), PosixPath('setup.py'),
PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
PosixPath('build/lib/pathlib.py')]
Navigating inside a directory tree:
>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')
Querying path properties:
>>> q.exists()
True
>>> q.is_dir()
False
Opening a file:
>>> with q.open() as f: f.readline()
...
'#!/bin/bash\n'
Exceptions¶
- exception pathlib.UnsupportedOperation¶
An exception inheriting
NotImplementedErrorthat is raised when an unsupported operation is called on a path object.Added in version 3.13.
Pure paths¶
Pure path objects provide path-handling operations which don’t actually access a filesystem. There are three ways to access these classes, which we also call flavours:
- class pathlib.PurePath(*pathsegments)¶
A generic class that represents the system’s path flavour (instantiating it creates either a
PurePosixPathor aPureWindowsPath):>>> PurePath('setup.py') # Running on a Unix machine PurePosixPath('setup.py')
Each element of pathsegments can be either a string representing a path segment, or an object implementing the
os.PathLikeinterface where the__fspath__()method returns a string, such as another path object:>>> PurePath('foo', 'some/path', 'bar') PurePosixPath('foo/some/path/bar') >>> PurePath(Path('foo'), Path('bar')) PurePosixPath('foo/bar')
When pathsegments is empty, the current directory is assumed:
>>> PurePath() PurePosixPath('.')
If a segment is an absolute path, all previous segments are ignored (like
os.path.join()):>>> PurePath('/etc', '/usr', 'lib64') PurePosixPath('/usr/lib64') >>> PureWindowsPath('c:/Windows', 'd:bar') PureWindowsPath('d:bar')
On Windows, the drive is not reset when a rooted relative path segment (e.g.,
r'\foo') is encountered:>>> PureWindowsPath('c:/Windows', '/Program Files') PureWindowsPath('c:/Program Files')
Spurious slashes and single dots are collapsed, but double dots (
'..') and leading double slashes ('//') are not, since this would change the meaning of a path for various reasons (e.g. symbolic links, UNC paths):>>> PurePath('foo//bar') PurePosixPath('foo/bar') >>> PurePath('//foo/bar') PurePosixPath('//foo/bar') >>> PurePath('foo/./bar') PurePosixPath('foo/bar') >>> PurePath('foo/../bar') PurePosixPath('foo/../bar')
(a naïve approach would make
PurePosixPath('foo/../bar')equivalent toPurePosixPath('bar'), which is wrong iffoois a symbolic link to another directory)Pure path objects implement the
os.PathLikeinterface, allowing them to be used anywhere the interface is accepted.Changed in version 3.6: Added support for the
os.PathLikeinterface.
- class pathlib.PurePosixPath(*pathsegments)¶
A subclass of
PurePath, this path flavour represents non-Windows filesystem paths:>>> PurePosixPath('/etc/hosts') PurePosixPath('/etc/hosts')
pathsegments is specified similarly to
PurePath.
- class pathlib.PureWindowsPath(*pathsegments)¶
A subclass of
PurePath, this path flavour represents Windows filesystem paths, including UNC paths:>>> PureWindowsPath('c:/', 'Users', 'Ximénez') PureWindowsPath('c:/Users/Ximénez') >>> PureWindowsPath('//server/share/file') PureWindowsPath('//server/share/file')
pathsegments is specified similarly to
PurePath.
Regardless of the system you’re running on, you can instantiate all of these classes, since they don’t provide any operation that does system calls.
General properties¶
Paths are immutable and hashable. Paths of a same flavour are comparable and orderable. These properties respect the flavour’s case-folding semantics:
>>> PurePosixPath('foo') == PurePosixPath('FOO')
False
>>> PureWindowsPath('foo') == PureWindowsPath('FOO')
True
>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
True
>>> PureWindowsPath('C:') < PureWindowsPath('d:')
True
Paths of a different flavour compare unequal and cannot be ordered:
>>> PureWindowsPath('foo') == PurePosixPath('foo')
False
>>> PureWindowsPath('foo') < PurePosixPath('foo')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
Operators¶
The slash operator helps create child paths, like os.path.join().
If the argument is an absolute path, the previous path is ignored.
On Windows, the drive is not reset when the argument is a rooted
relative path (e.g., r'\foo'):
>>> p = PurePath('/etc')
>>> p
PurePosixPath('/etc')
>>> p / 'init.d' / 'apache2'
PurePosixPath('/etc/init.d/apache2')
>>> q = PurePath('bin')
>>> '/usr' / q
PurePosixPath('/usr/bin')
>>> p / '/an_absolute_path'
PurePosixPath('/an_absolute_path')
>>> PureWindowsPath('c:/Windows', '/Program Files')
PureWindowsPath('c:/Program Files')
A path object can be used anywhere an object implementing os.PathLike
is accepted:
>>> import os
>>> p = PurePath('/etc')
>>> os.fspath(p)
'/etc'
The string representation of a path is the raw filesystem path itself (in native form, e.g. with backslashes under Windows), which you can pass to any function taking a file path as a string:
>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'
Similarly, calling bytes on a path gives the raw filesystem path as a
bytes object, as encoded by os.fsencode():
>>> bytes(p)
b'/etc'
Note
Calling bytes is only recommended under Unix. Under Windows,
the unicode form is the canonical representation of filesystem paths.
Accessing individual parts¶
To access the individual “parts” (components) of a path, use the following property:
- PurePath.parts¶
A tuple giving access to the path’s various components:
>>> p = PurePath('/usr/bin/python3') >>> p.parts ('/', 'usr', 'bin', 'python3') >>> p = PureWindowsPath('c:/Program Files/PSF') >>> p.parts ('c:\\', 'Program Files', 'PSF')
(note how the drive and local root are regrouped in a single part)
Methods and properties¶
Pure paths provide the following methods and properties:
- PurePath.parser¶
The implementation of the
os.pathmodule used for low-level path parsing and joining: eitherposixpathorntpath.Added in version 3.13.
- PurePath.drive¶
A string representing the drive letter or name, if any:
>>> PureWindowsPath('c:/Program Files/').drive 'c:' >>> PureWindowsPath('/Program Files/').drive '' >>> PurePosixPath('/etc').drive ''
UNC shares are also considered drives:
>>> PureWindowsPath('//host/share/foo.txt').drive '\\\\host\\share'
- PurePath.root¶
A string representing the (local or global) root, if any:
>>> PureWindowsPath('c:/Program Files/').root '\\' >>> PureWindowsPath('c:Program Files/').root '' >>> PurePosixPath('/etc').root '/'
UNC shares always have a root:
>>> PureWindowsPath('//host/share').root '\\'
If the path starts with more than two successive slashes,
PurePosixPathcollapses them:>>> PurePosixPath('//etc').root '//' >>> PurePosixPath('///etc').root '/' >>> PurePosixPath('////etc').root '/'
Note
This behavior conforms to The Open Group Base Specifications Issue 6, paragraph 4.11 Pathname Resolution:
“A pathname that begins with two successive slashes may be interpreted in an implementation-defined manner, although more than two leading slashes shall be treated as a single slash.”
- PurePath.anchor¶
The concatenation of the drive and root:
>>> PureWindowsPath('c:/Program Files/').anchor 'c:\\' >>> PureWindowsPath('c:Program Files/').anchor 'c:' >>> PurePosixPath('/etc').anchor '/' >>> PureWindowsPath('//host/share').anchor '\\\\host\\share\\'
- PurePath.parents¶
An immutable sequence providing access to the logical ancestors of the path:
>>> p = PureWindowsPath('c:/foo/bar/setup.py') >>> p.parents[0] PureWindowsPath('c:/foo/bar') >>> p.parents[1] PureWindowsPath('c:/foo') >>> p.parents[2] PureWindowsPath('c:/')
Changed in version 3.10: The parents sequence now supports slices and negative index values.
- PurePath.parent¶
The logical parent of the path:
>>> p = PurePosixPath('/a/b/c/d') >>> p.parent PurePosixPath('/a/b/c')
You cannot go past an anchor, or empty path:
>>> p = PurePosixPath('/') >>> p.parent PurePosixPath('/') >>> p = PurePosixPath('.') >>> p.parent PurePosixPath('.')
Note
This is a purely lexical operation, hence the following behaviour:
>>> p = PurePosixPath('foo/..') >>> p.parent PurePosixPath('foo')
If you want to walk an arbitrary filesystem path upwards, it is recommended to first call
Path.resolve()so as to resolve symlinks and eliminate".."components.
- PurePath.name¶
A string representing the final path component, excluding the drive and root, if any:
>>> PurePosixPath('my/library/setup.py').name 'setup.py'
UNC drive names are not considered:
>>> PureWindowsPath('//some/share/setup.py').name 'setup.py' >>> PureWindowsPath('//some/share').name ''
- PurePath.suffix¶
The last dot-separated portion of the final component, if any:
>>> PurePosixPath('my/library/setup.py').suffix '.py' >>> PurePosixPath('my/library.tar.gz').suffix '.gz' >>> PurePosixPath('my/library').suffix ''
This is commonly called the file extension.
Changed in version 3.14: A single dot (”
.”) is considered a valid suffix.
- PurePath.suffixes¶
A list of the path’s suffixes, often called file extensions:
>>> PurePosixPath('my/library.tar.gar').suffixes ['.tar', '.gar'] >>> PurePosixPath('my/library.tar.gz').suffixes ['.tar', '.gz'] >>> PurePosixPath('my/library').suffixes []
Changed in version 3.14: A single dot (”
.”) is considered a valid suffix.
- PurePath.stem¶
The final path component, without its suffix:
>>> PurePosixPath('my/library.tar.gz').stem 'library.tar' >>> PurePosixPath('my/library.tar').stem 'library' >>> PurePosixPath('my/library').stem 'library'
- PurePath.as_posix()¶
Return a string representation of the path with forward slashes (
/):>>> p = PureWindowsPath('c:\\windows') >>> str(p) 'c:\\windows' >>> p.as_posix() 'c:/windows'
- PurePath.is_absolute()¶
Return whether the path is absolute or not. A path is considered absolute if it has both a root and (if the flavour allows) a drive:
>>> PurePosixPath('/a/b').is_absolute() True >>> PurePosixPath('a/b').is_absolute() False >>> PureWindowsPath('c:/a/b').is_absolute() True >>> PureWindowsPath('/a/b').is_absolute() False >>> PureWindowsPath('c:').is_absolute() False >>> PureWindowsPath('//some/share').is_absolute() True
- PurePath.is_relative_to(other)¶
Return whether or not this path is relative to the other path.
>>> p = PurePath('/etc/passwd') >>> p.is_relative_to('/etc') True >>> p.is_relative_to('/usr') False
This method is string-based; it neither accesses the filesystem nor treats “
..” segments specially. The following code is equivalent:>>> u = PurePath('/usr') >>> u == p or u in p.parents False
Added in version 3.9.
Deprecated since version 3.12, removed in version 3.14: Passing additional arguments is deprecated; if supplied, they are joined with other.
- PurePath.is_reserved()¶
With
PureWindowsPath, returnTrueif the path is considered reserved under Windows,Falseotherwise. WithPurePosixPath,Falseis always returned.Changed in version 3.13: Windows path names that contain a colon, or end with a dot or a space, are considered reserved. UNC paths may be reserved.
Deprecated since version 3.13, will be removed in version 3.15: This method is deprecated; use
os.path.isreserved()to detect reserved paths on Windows.
- PurePath.joinpath(*pathsegments)¶
Calling this method is equivalent to combining the path with each of the given pathsegments in turn:
>>> PurePosixPath('/etc').joinpath('passwd') PurePosixPath('/etc/passwd') >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd')) PurePosixPath('/etc/passwd') >>> PurePosixPath('/etc').joinpath('init.d', 'apache2') PurePosixPath('/etc/init.d/apache2') >>> PureWindowsPath('c:').joinpath('/Program Files') PureWindowsPath('c:/Program Files')
- PurePath.full_match(pattern, *, case_sensitive=None)¶
Match this path against the provided glob-style pattern. Return
Trueif matching is successful,Falseotherwise. For example:>>> PurePath('a/b.py').full_match('a/*.py') True >>> PurePath('a/b.py').full_match('*.py') False >>> PurePath('/a/b/c.py').full_match('/a/**') True >>> PurePath('/a/b/c.py').full_match('**/*.py') True
See also
Pattern language documentation.
As with other methods, case-sensitivity follows platform defaults:
>>> PurePosixPath('b.py').full_match('*.PY') False >>> PureWindowsPath('b.py').full_match('*.PY') True
Set case_sensitive to
TrueorFalseto override this behaviour.Added in version 3.13.
- PurePath.match(pattern, *, case_sensitive=None)¶
Match this path against the provided non-recursive glob-style pattern. Return
Trueif matching is successful,Falseotherwise.This method is similar to
full_match(), but empty patterns aren’t allowed (ValueErroris raised), the recursive wildcard “**” isn’t supported (it acts like non-recursive “*”), and if a relative pattern is provided, then matching is done from the right:>>> PurePath('a/b.py').match('*.py') True >>> PurePath('/a/b/c.py').match('b/*.py') True >>> PurePath('/a/b/c.py').match('a/*.py') False
Changed in version 3.12: The pattern parameter accepts a path-like object.
Changed in version 3.12: The case_sensitive parameter was added.
- PurePath.relative_to(other, walk_up=False)¶
Compute a version of this path relative to the path represented by other. If it’s impossible,
ValueErroris raised:>>> p = PurePosixPath('/etc/passwd') >>> p.relative_to('/') PurePosixPath('etc/passwd') >>> p.relative_to('/etc') PurePosixPath('passwd') >>> p.relative_to('/usr') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "pathlib.py", line 941, in relative_to raise ValueError(error_message.format(str(self), str(formatted))) ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.
When walk_up is false (the default), the path must start with other. When the argument is true,
..entries may be added to form the relative path. In all other cases, such as the paths referencing different drives,ValueErroris raised.:>>> p.relative_to('/usr', walk_up=True) PurePosixPath('../etc/passwd') >>> p.relative_to('foo', walk_up=True) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "pathlib.py", line 941, in relative_to raise ValueError(error_message.format(str(self), str(formatted))) ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.
Warning
This function is part of
PurePathand works with strings. It does not check or access the underlying file structure. This can impact the walk_up option as it assumes that no symlinks are present in the path; callresolve()first if necessary to resolve symlinks.Changed in version 3.12: The walk_up parameter was added (old behavior is the same as
walk_up=False).Deprecated since version 3.12, removed in version 3.14: Passing additional positional arguments is deprecated; if supplied, they are joined with other.
- PurePath.with_name(name)¶
Return a new path with the
namechanged. If the original path doesn’t have a name, ValueError is raised:>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') >>> p.with_name('setup.py') PureWindowsPath('c:/Downloads/setup.py') >>> p = PureWindowsPath('c:/') >>> p.with_name('setup.py') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name raise ValueError("%r has an empty name" % (self,)) ValueError: PureWindowsPath('c:/') has an empty name
- PurePath.with_stem(stem)¶
Return a new path with the
stemchanged. If the original path doesn’t have a name, ValueError is raised:>>> p = PureWindowsPath('c:/Downloads/draft.txt') >>> p.with_stem('final') PureWindowsPath('c:/Downloads/final.txt') >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') >>> p.with_stem('lib') PureWindowsPath('c:/Downloads/lib.gz') >>> p = PureWindowsPath('c:/') >>> p.with_stem('') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem return self.with_name(stem + self.suffix) File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name raise ValueError("%r has an empty name" % (self,)) ValueError: PureWindowsPath('c:/') has an empty name
Added in version 3.9.
- PurePath.with_suffix(suffix)¶
Return a new path with the
suffixchanged. If the original path doesn’t have a suffix, the new suffix is appended instead. If the suffix is an empty string, the original suffix is removed:>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') >>> p.with_suffix('.bz2') PureWindowsPath('c:/Downloads/pathlib.tar.bz2') >>> p = PureWindowsPath('README') >>> p.with_suffix('.txt') PureWindowsPath('README.txt') >>> p = PureWindowsPath('README.txt') >>> p.with_suffix('') PureWindowsPath('README')
Changed in version 3.14: A single dot (”
.”) is considered a valid suffix. In previous versions,ValueErroris raised if a single dot is supplied.
- PurePath.with_segments(*pathsegments)¶
Create a new path object of the same type by combining the given pathsegments. This method is called whenever a derivative path is created, such as from
parentandrelative_to(). Subclasses may override this method to pass information to derivative paths, for example:from pathlib import PurePosixPath class MyPath(PurePosixPath): def __init__(self, *pathsegments, session_id): super().__init__(*pathsegments) self.session_id = session_id def with_segments(self, *pathsegments): return type(self)(*pathsegments, session_id=self.session_id) etc = MyPath('/etc', session_id=42) hosts = etc / 'hosts' print(hosts.session_id) # 42
Added in version 3.12.
Concrete paths¶
Concrete paths are subclasses of the pure path classes. In addition to operations provided by the latter, they also provide methods to do system calls on path objects. There are three ways to instantiate concrete paths:
- class pathlib.Path(*pathsegments)¶
A subclass of
PurePath, this class represents concrete paths of the system’s path flavour (instantiating it creates either aPosixPathor aWindowsPath):>>> Path('setup.py') PosixPath('setup.py')
pathsegments is specified similarly to
PurePath.
- class pathlib.PosixPath(*pathsegments)¶
A subclass of
PathandPurePosixPath, this class represents concrete non-Windows filesystem paths:>>> PosixPath('/etc/hosts') PosixPath('/etc/hosts')
pathsegments is specified similarly to
PurePath.Changed in version 3.13: Raises
UnsupportedOperationon Windows. In previous versions,NotImplementedErrorwas raised instead.
- class pathlib.WindowsPath(*pathsegments)¶
A subclass of
PathandPureWindowsPath, this class represents concrete Windows filesystem paths:>>> WindowsPath('c:/', 'Users', 'Ximénez') WindowsPath('c:/Users/Ximénez')
pathsegments is specified similarly to
PurePath.Changed in version 3.13: Raises
UnsupportedOperationon non-Windows platforms. In previous versions,NotImplementedErrorwas raised instead.
You can only instantiate the class flavour that corresponds to your system (allowing system calls on non-compatible path flavours could lead to bugs or failures in your application):
>>> import os
>>> os.name
'posix'
>>> Path('setup.py')
PosixPath('setup.py')
>>> PosixPath('setup.py')
PosixPath('setup.py')
>>> WindowsPath('setup.py')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pathlib.py", line 798, in __new__
% (cls.__name__,))
UnsupportedOperation: cannot instantiate 'WindowsPath' on your system
Some concrete path methods can raise an OSError if a system call fails
(for example because the path doesn’t exist).
Parsing and generating URIs¶
Concrete path objects can be created from, and represented as, ‘file’ URIs conforming to RFC 8089.
Note
File URIs are not portable across machines with different filesystem encodings.
- classmethod Path.from_uri(uri)¶
Return a new path object from parsing a ‘file’ URI. For example:
>>> p = Path.from_uri('file:///etc/hosts') PosixPath('/etc/hosts')
On Windows, DOS device and UNC paths may be parsed from URIs:
>>> p = Path.from_uri('file:///c:/windows') WindowsPath('c:/windows') >>> p = Path.from_uri('file://server/share') WindowsPath('//server/share')
Several variant forms are supported:
>>> p = Path.from_uri('file:////server/share') WindowsPath('//server/share') >>> p = Path.from_uri('file://///server/share') WindowsPath('//server/share') >>> p = Path.from_uri('file:c:/windows') WindowsPath('c:/windows') >>> p = Path.from_uri('file:/c|/windows') WindowsPath('c:/windows')
ValueErroris raised if the URI does not start withfile:, or the parsed path isn’t absolute.Added in version 3.13.
Changed in version 3.14: The URL authority is discarded if it matches the local hostname. Otherwise, if the authority isn’t empty or
localhost, then on Windows a UNC path is returned (as before), and on other platforms aValueErroris raised.
- Path.as_uri()¶
Represent the path as a ‘file’ URI.
ValueErroris raised if the path isn’t absolute.>>> p = PosixPath('/etc/passwd') >>> p.as_uri() 'file:///etc/passwd' >>> p = WindowsPath('c:/Windows') >>> p.as_uri() 'file:///c:/Windows'
Deprecated since version 3.14, will be removed in version 3.19: Calling this method from
PurePathrather thanPathis possible but deprecated. The method’s use ofos.fsencode()makes it strictly impure.
Expanding and resolving paths¶
- classmethod Path.home()¶
Return a new path object representing the user’s home directory (as returned by
os.path.expanduser()with~construct). If the home directory can’t be resolved,RuntimeErroris raised.>>> Path.home() PosixPath('/home/antoine')
Added in version 3.5.
- Path.expanduser()¶
Return a new path with expanded
~and~userconstructs, as returned byos.path.expanduser(). If a home directory can’t be resolved,RuntimeErroris raised.>>> p = PosixPath('~/films/Monty Python') >>> p.expanduser() PosixPath('/home/eric/films/Monty Python')
Added in version 3.5.
- classmethod Path.cwd()¶
Return a new path object representing the current directory (as returned by
os.getcwd()):>>> Path.cwd() PosixPath('/home/antoine/pathlib')
- Path.absolute()¶
Make the path absolute, without normalization or resolving symlinks. Returns a new path object:
>>> p = Path('tests') >>> p PosixPath('tests') >>> p.absolute() PosixPath('/home/antoine/pathlib/tests')
- Path.resolve(strict=False)¶
Make the path absolute, resolving any symlinks. A new path object is returned:
>>> p = Path() >>> p PosixPath('.') >>> p.resolve() PosixPath('/home/antoine/pathlib')
“
..” components are also eliminated (this is the only method to do so):>>> p = Path('docs/../setup.py') >>> p.resolve() PosixPath('/home/antoine/pathlib/setup.py')
If a path doesn’t exist or a symlink loop is encountered, and strict is
True,OSErroris raised. If strict isFalse, the path is resolved as far as possible and any remainder is appended without checking whether it exists.Changed in version 3.6: The strict parameter was added (pre-3.6 behavior is strict).
Changed in version 3.13: Symlink loops are treated like other errors:
OSErroris raised in strict mode, and no exception is raised in non-strict mode. In previous versions,RuntimeErroris raised no matter the value of strict.
- Path.readlink()¶
Return the path to which the symbolic link points (as returned by
os.readlink()):>>> p = Path('mylink') >>> p.symlink_to('setup.py') >>> p.readlink() PosixPath('setup.py')
Added in version 3.9.
Changed in version 3.13: Raises
UnsupportedOperationifos.readlink()is not available. In previous versions,NotImplementedErrorwas raised.
Querying file type and status¶
Changed in version 3.8: exists(), is_dir(), is_file(),
is_mount(), is_symlink(),
is_block_device(), is_char_device(),
is_fifo(), is_socket() now return False
instead of raising an exception for paths that contain characters
unrepresentable at the OS level.
Changed in version 3.14: The methods given above now return False instead of raising any
OSError exception from the operating system. In previous versions,
some kinds of OSError exception are raised, and others suppressed.
The new behaviour is consistent with os.path.exists(),
os.path.isdir(), etc. Use stat() to retrieve the file
status without suppressing exceptions.
- Path.stat(*, follow_symlinks=True)¶
Return an
os.stat_resultobject containing information about this path, likeos.stat(). The result is looked up at each call to this method.This method normally follows symlinks; to stat a symlink add the argument
follow_symlinks=False, or uselstat().>>> p = Path('setup.py') >>> p.stat().st_size 956 >>> p.stat().st_mtime 1327883547.852554
Changed in version 3.10: The follow_symlinks parameter was added.
- Path.lstat()¶
Like
Path.stat()but, if the path points to a symbolic link, return the symbolic link’s information rather than its target’s.
- Path.exists(*, follow_symlinks=True)¶
Return
Trueif the path points to an existing file or directory.Falsewill be returned if the path is invalid, inaccessible or missing. UsePath.stat()to distinguish between these cases.This method normally follows symlinks; to check if a symlink exists, add the argument
follow_symlinks=False.>>> Path('.').exists() True >>> Path('setup.py').exists() True >>> Path('/etc').exists() True >>> Path('nonexistentfile').exists() False
Changed in version 3.12: The follow_symlinks parameter was added.
- Path.is_file(*, follow_symlinks=True)