xref: /third_party/python/Doc/library/pathlib.rst (revision 7db96d56)
17db96d56Sopenharmony_ci
27db96d56Sopenharmony_ci:mod:`pathlib` --- Object-oriented filesystem paths
37db96d56Sopenharmony_ci===================================================
47db96d56Sopenharmony_ci
57db96d56Sopenharmony_ci.. module:: pathlib
67db96d56Sopenharmony_ci   :synopsis: Object-oriented filesystem paths
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci.. versionadded:: 3.4
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci**Source code:** :source:`Lib/pathlib.py`
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci.. index:: single: path; operations
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci--------------
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciThis module offers classes representing filesystem paths with semantics
177db96d56Sopenharmony_ciappropriate for different operating systems.  Path classes are divided
187db96d56Sopenharmony_cibetween :ref:`pure paths <pure-paths>`, which provide purely computational
197db96d56Sopenharmony_cioperations without I/O, and :ref:`concrete paths <concrete-paths>`, which
207db96d56Sopenharmony_ciinherit from pure paths but also provide I/O operations.
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ci.. image:: pathlib-inheritance.png
237db96d56Sopenharmony_ci   :align: center
247db96d56Sopenharmony_ci   :class: invert-in-dark-mode
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciIf you've never used this module before or just aren't sure which class is
277db96d56Sopenharmony_ciright for your task, :class:`Path` is most likely what you need. It instantiates
287db96d56Sopenharmony_cia :ref:`concrete path <concrete-paths>` for the platform the code is running on.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ciPure paths are useful in some special cases; for example:
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ci#. If you want to manipulate Windows paths on a Unix machine (or vice versa).
337db96d56Sopenharmony_ci   You cannot instantiate a :class:`WindowsPath` when running on Unix, but you
347db96d56Sopenharmony_ci   can instantiate :class:`PureWindowsPath`.
357db96d56Sopenharmony_ci#. You want to make sure that your code only manipulates paths without actually
367db96d56Sopenharmony_ci   accessing the OS. In this case, instantiating one of the pure classes may be
377db96d56Sopenharmony_ci   useful since those simply don't have any OS-accessing operations.
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci.. seealso::
407db96d56Sopenharmony_ci   :pep:`428`: The pathlib module -- object-oriented filesystem paths.
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci.. seealso::
437db96d56Sopenharmony_ci   For low-level path manipulation on strings, you can also use the
447db96d56Sopenharmony_ci   :mod:`os.path` module.
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci
477db96d56Sopenharmony_ciBasic use
487db96d56Sopenharmony_ci---------
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ciImporting the main class::
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci   >>> from pathlib import Path
537db96d56Sopenharmony_ci
547db96d56Sopenharmony_ciListing subdirectories::
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci   >>> p = Path('.')
577db96d56Sopenharmony_ci   >>> [x for x in p.iterdir() if x.is_dir()]
587db96d56Sopenharmony_ci   [PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
597db96d56Sopenharmony_ci    PosixPath('__pycache__'), PosixPath('build')]
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ciListing Python source files in this directory tree::
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci   >>> list(p.glob('**/*.py'))
647db96d56Sopenharmony_ci   [PosixPath('test_pathlib.py'), PosixPath('setup.py'),
657db96d56Sopenharmony_ci    PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
667db96d56Sopenharmony_ci    PosixPath('build/lib/pathlib.py')]
677db96d56Sopenharmony_ci
687db96d56Sopenharmony_ciNavigating inside a directory tree::
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_ci   >>> p = Path('/etc')
717db96d56Sopenharmony_ci   >>> q = p / 'init.d' / 'reboot'
727db96d56Sopenharmony_ci   >>> q
737db96d56Sopenharmony_ci   PosixPath('/etc/init.d/reboot')
747db96d56Sopenharmony_ci   >>> q.resolve()
757db96d56Sopenharmony_ci   PosixPath('/etc/rc.d/init.d/halt')
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ciQuerying path properties::
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   >>> q.exists()
807db96d56Sopenharmony_ci   True
817db96d56Sopenharmony_ci   >>> q.is_dir()
827db96d56Sopenharmony_ci   False
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_ciOpening a file::
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci   >>> with q.open() as f: f.readline()
877db96d56Sopenharmony_ci   ...
887db96d56Sopenharmony_ci   '#!/bin/bash\n'
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci.. _pure-paths:
927db96d56Sopenharmony_ci
937db96d56Sopenharmony_ciPure paths
947db96d56Sopenharmony_ci----------
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ciPure path objects provide path-handling operations which don't actually
977db96d56Sopenharmony_ciaccess a filesystem.  There are three ways to access these classes, which
987db96d56Sopenharmony_ciwe also call *flavours*:
997db96d56Sopenharmony_ci
1007db96d56Sopenharmony_ci.. class:: PurePath(*pathsegments)
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci   A generic class that represents the system's path flavour (instantiating
1037db96d56Sopenharmony_ci   it creates either a :class:`PurePosixPath` or a :class:`PureWindowsPath`)::
1047db96d56Sopenharmony_ci
1057db96d56Sopenharmony_ci      >>> PurePath('setup.py')      # Running on a Unix machine
1067db96d56Sopenharmony_ci      PurePosixPath('setup.py')
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci   Each element of *pathsegments* can be either a string representing a
1097db96d56Sopenharmony_ci   path segment, an object implementing the :class:`os.PathLike` interface
1107db96d56Sopenharmony_ci   which returns a string, or another path object::
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci      >>> PurePath('foo', 'some/path', 'bar')
1137db96d56Sopenharmony_ci      PurePosixPath('foo/some/path/bar')
1147db96d56Sopenharmony_ci      >>> PurePath(Path('foo'), Path('bar'))
1157db96d56Sopenharmony_ci      PurePosixPath('foo/bar')
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci   When *pathsegments* is empty, the current directory is assumed::
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci      >>> PurePath()
1207db96d56Sopenharmony_ci      PurePosixPath('.')
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   If a segment is an absolute path, all previous segments are ignored
1237db96d56Sopenharmony_ci   (like :func:`os.path.join`)::
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci      >>> PurePath('/etc', '/usr', 'lib64')
1267db96d56Sopenharmony_ci      PurePosixPath('/usr/lib64')
1277db96d56Sopenharmony_ci      >>> PureWindowsPath('c:/Windows', 'd:bar')
1287db96d56Sopenharmony_ci      PureWindowsPath('d:bar')
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci   On Windows, the drive is not reset when a rooted relative path
1317db96d56Sopenharmony_ci   segment (e.g., ``r'\foo'``) is encountered::
1327db96d56Sopenharmony_ci
1337db96d56Sopenharmony_ci      >>> PureWindowsPath('c:/Windows', '/Program Files')
1347db96d56Sopenharmony_ci      PureWindowsPath('c:/Program Files')
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci   Spurious slashes and single dots are collapsed, but double dots (``'..'``)
1377db96d56Sopenharmony_ci   and leading double slashes (``'//'``) are not, since this would change the
1387db96d56Sopenharmony_ci   meaning of a path for various reasons (e.g. symbolic links, UNC paths)::
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci      >>> PurePath('foo//bar')
1417db96d56Sopenharmony_ci      PurePosixPath('foo/bar')
1427db96d56Sopenharmony_ci      >>> PurePath('//foo/bar')
1437db96d56Sopenharmony_ci      PurePosixPath('//foo/bar')
1447db96d56Sopenharmony_ci      >>> PurePath('foo/./bar')
1457db96d56Sopenharmony_ci      PurePosixPath('foo/bar')
1467db96d56Sopenharmony_ci      >>> PurePath('foo/../bar')
1477db96d56Sopenharmony_ci      PurePosixPath('foo/../bar')
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci   (a naïve approach would make ``PurePosixPath('foo/../bar')`` equivalent
1507db96d56Sopenharmony_ci   to ``PurePosixPath('bar')``, which is wrong if ``foo`` is a symbolic link
1517db96d56Sopenharmony_ci   to another directory)
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci   Pure path objects implement the :class:`os.PathLike` interface, allowing them
1547db96d56Sopenharmony_ci   to be used anywhere the interface is accepted.
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci   .. versionchanged:: 3.6
1577db96d56Sopenharmony_ci      Added support for the :class:`os.PathLike` interface.
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci.. class:: PurePosixPath(*pathsegments)
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci   A subclass of :class:`PurePath`, this path flavour represents non-Windows
1627db96d56Sopenharmony_ci   filesystem paths::
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci      >>> PurePosixPath('/etc')
1657db96d56Sopenharmony_ci      PurePosixPath('/etc')
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci   *pathsegments* is specified similarly to :class:`PurePath`.
1687db96d56Sopenharmony_ci
1697db96d56Sopenharmony_ci.. class:: PureWindowsPath(*pathsegments)
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci   A subclass of :class:`PurePath`, this path flavour represents Windows
1727db96d56Sopenharmony_ci   filesystem paths, including `UNC paths`_::
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci      >>> PureWindowsPath('c:/Program Files/')
1757db96d56Sopenharmony_ci      PureWindowsPath('c:/Program Files')
1767db96d56Sopenharmony_ci      >>> PureWindowsPath('//server/share/file')
1777db96d56Sopenharmony_ci      PureWindowsPath('//server/share/file')
1787db96d56Sopenharmony_ci
1797db96d56Sopenharmony_ci   *pathsegments* is specified similarly to :class:`PurePath`.
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ci   .. _unc paths: https://en.wikipedia.org/wiki/Path_(computing)#UNC
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ciRegardless of the system you're running on, you can instantiate all of
1847db96d56Sopenharmony_cithese classes, since they don't provide any operation that does system calls.
1857db96d56Sopenharmony_ci
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ciGeneral properties
1887db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^
1897db96d56Sopenharmony_ci
1907db96d56Sopenharmony_ciPaths are immutable and :term:`hashable`.  Paths of a same flavour are comparable
1917db96d56Sopenharmony_ciand orderable.  These properties respect the flavour's case-folding
1927db96d56Sopenharmony_cisemantics::
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci   >>> PurePosixPath('foo') == PurePosixPath('FOO')
1957db96d56Sopenharmony_ci   False
1967db96d56Sopenharmony_ci   >>> PureWindowsPath('foo') == PureWindowsPath('FOO')
1977db96d56Sopenharmony_ci   True
1987db96d56Sopenharmony_ci   >>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
1997db96d56Sopenharmony_ci   True
2007db96d56Sopenharmony_ci   >>> PureWindowsPath('C:') < PureWindowsPath('d:')
2017db96d56Sopenharmony_ci   True
2027db96d56Sopenharmony_ci
2037db96d56Sopenharmony_ciPaths of a different flavour compare unequal and cannot be ordered::
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ci   >>> PureWindowsPath('foo') == PurePosixPath('foo')
2067db96d56Sopenharmony_ci   False
2077db96d56Sopenharmony_ci   >>> PureWindowsPath('foo') < PurePosixPath('foo')
2087db96d56Sopenharmony_ci   Traceback (most recent call last):
2097db96d56Sopenharmony_ci     File "<stdin>", line 1, in <module>
2107db96d56Sopenharmony_ci   TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ciOperators
2147db96d56Sopenharmony_ci^^^^^^^^^
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ciThe slash operator helps create child paths, like :func:`os.path.join`.
2177db96d56Sopenharmony_ciIf the argument is an absolute path, the previous path is ignored.
2187db96d56Sopenharmony_ciOn Windows, the drive is not reset when the argument is a rooted
2197db96d56Sopenharmony_cirelative path (e.g., ``r'\foo'``)::
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci   >>> p = PurePath('/etc')
2227db96d56Sopenharmony_ci   >>> p
2237db96d56Sopenharmony_ci   PurePosixPath('/etc')
2247db96d56Sopenharmony_ci   >>> p / 'init.d' / 'apache2'
2257db96d56Sopenharmony_ci   PurePosixPath('/etc/init.d/apache2')
2267db96d56Sopenharmony_ci   >>> q = PurePath('bin')
2277db96d56Sopenharmony_ci   >>> '/usr' / q
2287db96d56Sopenharmony_ci   PurePosixPath('/usr/bin')
2297db96d56Sopenharmony_ci   >>> p / '/an_absolute_path'
2307db96d56Sopenharmony_ci   PurePosixPath('/an_absolute_path')
2317db96d56Sopenharmony_ci   >>> PureWindowsPath('c:/Windows', '/Program Files')
2327db96d56Sopenharmony_ci   PureWindowsPath('c:/Program Files')
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ciA path object can be used anywhere an object implementing :class:`os.PathLike`
2357db96d56Sopenharmony_ciis accepted::
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci   >>> import os
2387db96d56Sopenharmony_ci   >>> p = PurePath('/etc')
2397db96d56Sopenharmony_ci   >>> os.fspath(p)
2407db96d56Sopenharmony_ci   '/etc'
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ciThe string representation of a path is the raw filesystem path itself
2437db96d56Sopenharmony_ci(in native form, e.g. with backslashes under Windows), which you can
2447db96d56Sopenharmony_cipass to any function taking a file path as a string::
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci   >>> p = PurePath('/etc')
2477db96d56Sopenharmony_ci   >>> str(p)
2487db96d56Sopenharmony_ci   '/etc'
2497db96d56Sopenharmony_ci   >>> p = PureWindowsPath('c:/Program Files')
2507db96d56Sopenharmony_ci   >>> str(p)
2517db96d56Sopenharmony_ci   'c:\\Program Files'
2527db96d56Sopenharmony_ci
2537db96d56Sopenharmony_ciSimilarly, calling :class:`bytes` on a path gives the raw filesystem path as a
2547db96d56Sopenharmony_cibytes object, as encoded by :func:`os.fsencode`::
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci   >>> bytes(p)
2577db96d56Sopenharmony_ci   b'/etc'
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci.. note::
2607db96d56Sopenharmony_ci   Calling :class:`bytes` is only recommended under Unix.  Under Windows,
2617db96d56Sopenharmony_ci   the unicode form is the canonical representation of filesystem paths.
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ciAccessing individual parts
2657db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^^^^^
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ciTo access the individual "parts" (components) of a path, use the following
2687db96d56Sopenharmony_ciproperty:
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci.. attribute:: PurePath.parts
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci   A tuple giving access to the path's various components::
2737db96d56Sopenharmony_ci
2747db96d56Sopenharmony_ci      >>> p = PurePath('/usr/bin/python3')
2757db96d56Sopenharmony_ci      >>> p.parts
2767db96d56Sopenharmony_ci      ('/', 'usr', 'bin', 'python3')
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/Program Files/PSF')
2797db96d56Sopenharmony_ci      >>> p.parts
2807db96d56Sopenharmony_ci      ('c:\\', 'Program Files', 'PSF')
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ci   (note how the drive and local root are regrouped in a single part)
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ciMethods and properties
2867db96d56Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci.. testsetup::
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci   from pathlib import PurePath, PurePosixPath, PureWindowsPath
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ciPure paths provide the following methods and properties:
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci.. attribute:: PurePath.drive
2957db96d56Sopenharmony_ci
2967db96d56Sopenharmony_ci   A string representing the drive letter or name, if any::
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci      >>> PureWindowsPath('c:/Program Files/').drive
2997db96d56Sopenharmony_ci      'c:'
3007db96d56Sopenharmony_ci      >>> PureWindowsPath('/Program Files/').drive
3017db96d56Sopenharmony_ci      ''
3027db96d56Sopenharmony_ci      >>> PurePosixPath('/etc').drive
3037db96d56Sopenharmony_ci      ''
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci   UNC shares are also considered drives::
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci      >>> PureWindowsPath('//host/share/foo.txt').drive
3087db96d56Sopenharmony_ci      '\\\\host\\share'
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci.. attribute:: PurePath.root
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci   A string representing the (local or global) root, if any::
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci      >>> PureWindowsPath('c:/Program Files/').root
3157db96d56Sopenharmony_ci      '\\'
3167db96d56Sopenharmony_ci      >>> PureWindowsPath('c:Program Files/').root
3177db96d56Sopenharmony_ci      ''
3187db96d56Sopenharmony_ci      >>> PurePosixPath('/etc').root
3197db96d56Sopenharmony_ci      '/'
3207db96d56Sopenharmony_ci
3217db96d56Sopenharmony_ci   UNC shares always have a root::
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci      >>> PureWindowsPath('//host/share').root
3247db96d56Sopenharmony_ci      '\\'
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci   If the path starts with more than two successive slashes,
3277db96d56Sopenharmony_ci   :class:`~pathlib.PurePosixPath` collapses them::
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci      >>> PurePosixPath('//etc').root
3307db96d56Sopenharmony_ci      '//'
3317db96d56Sopenharmony_ci      >>> PurePosixPath('///etc').root
3327db96d56Sopenharmony_ci      '/'
3337db96d56Sopenharmony_ci      >>> PurePosixPath('////etc').root
3347db96d56Sopenharmony_ci      '/'
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci   .. note::
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci      This behavior conforms to *The Open Group Base Specifications Issue 6*,
3397db96d56Sopenharmony_ci      paragraph `4.11 Pathname Resolution
3407db96d56Sopenharmony_ci      <https://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11>`_:
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci      *"A pathname that begins with two successive slashes may be interpreted in
3437db96d56Sopenharmony_ci      an implementation-defined manner, although more than two leading slashes
3447db96d56Sopenharmony_ci      shall be treated as a single slash."*
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci.. attribute:: PurePath.anchor
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_ci   The concatenation of the drive and root::
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci      >>> PureWindowsPath('c:/Program Files/').anchor
3517db96d56Sopenharmony_ci      'c:\\'
3527db96d56Sopenharmony_ci      >>> PureWindowsPath('c:Program Files/').anchor
3537db96d56Sopenharmony_ci      'c:'
3547db96d56Sopenharmony_ci      >>> PurePosixPath('/etc').anchor
3557db96d56Sopenharmony_ci      '/'
3567db96d56Sopenharmony_ci      >>> PureWindowsPath('//host/share').anchor
3577db96d56Sopenharmony_ci      '\\\\host\\share\\'
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci.. attribute:: PurePath.parents
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci   An immutable sequence providing access to the logical ancestors of
3637db96d56Sopenharmony_ci   the path::
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/foo/bar/setup.py')
3667db96d56Sopenharmony_ci      >>> p.parents[0]
3677db96d56Sopenharmony_ci      PureWindowsPath('c:/foo/bar')
3687db96d56Sopenharmony_ci      >>> p.parents[1]
3697db96d56Sopenharmony_ci      PureWindowsPath('c:/foo')
3707db96d56Sopenharmony_ci      >>> p.parents[2]
3717db96d56Sopenharmony_ci      PureWindowsPath('c:/')
3727db96d56Sopenharmony_ci
3737db96d56Sopenharmony_ci   .. versionchanged:: 3.10
3747db96d56Sopenharmony_ci      The parents sequence now supports :term:`slices <slice>` and negative index values.
3757db96d56Sopenharmony_ci
3767db96d56Sopenharmony_ci.. attribute:: PurePath.parent
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci   The logical parent of the path::
3797db96d56Sopenharmony_ci
3807db96d56Sopenharmony_ci      >>> p = PurePosixPath('/a/b/c/d')
3817db96d56Sopenharmony_ci      >>> p.parent
3827db96d56Sopenharmony_ci      PurePosixPath('/a/b/c')
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci   You cannot go past an anchor, or empty path::
3857db96d56Sopenharmony_ci
3867db96d56Sopenharmony_ci      >>> p = PurePosixPath('/')
3877db96d56Sopenharmony_ci      >>> p.parent
3887db96d56Sopenharmony_ci      PurePosixPath('/')
3897db96d56Sopenharmony_ci      >>> p = PurePosixPath('.')
3907db96d56Sopenharmony_ci      >>> p.parent
3917db96d56Sopenharmony_ci      PurePosixPath('.')
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci   .. note::
3947db96d56Sopenharmony_ci      This is a purely lexical operation, hence the following behaviour::
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci         >>> p = PurePosixPath('foo/..')
3977db96d56Sopenharmony_ci         >>> p.parent
3987db96d56Sopenharmony_ci         PurePosixPath('foo')
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci      If you want to walk an arbitrary filesystem path upwards, it is
4017db96d56Sopenharmony_ci      recommended to first call :meth:`Path.resolve` so as to resolve
4027db96d56Sopenharmony_ci      symlinks and eliminate ``".."`` components.
4037db96d56Sopenharmony_ci
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci.. attribute:: PurePath.name
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_ci   A string representing the final path component, excluding the drive and
4087db96d56Sopenharmony_ci   root, if any::
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci      >>> PurePosixPath('my/library/setup.py').name
4117db96d56Sopenharmony_ci      'setup.py'
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci   UNC drive names are not considered::
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci      >>> PureWindowsPath('//some/share/setup.py').name
4167db96d56Sopenharmony_ci      'setup.py'
4177db96d56Sopenharmony_ci      >>> PureWindowsPath('//some/share').name
4187db96d56Sopenharmony_ci      ''
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci.. attribute:: PurePath.suffix
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci   The file extension of the final component, if any::
4247db96d56Sopenharmony_ci
4257db96d56Sopenharmony_ci      >>> PurePosixPath('my/library/setup.py').suffix
4267db96d56Sopenharmony_ci      '.py'
4277db96d56Sopenharmony_ci      >>> PurePosixPath('my/library.tar.gz').suffix
4287db96d56Sopenharmony_ci      '.gz'
4297db96d56Sopenharmony_ci      >>> PurePosixPath('my/library').suffix
4307db96d56Sopenharmony_ci      ''
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci.. attribute:: PurePath.suffixes
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci   A list of the path's file extensions::
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci      >>> PurePosixPath('my/library.tar.gar').suffixes
4387db96d56Sopenharmony_ci      ['.tar', '.gar']
4397db96d56Sopenharmony_ci      >>> PurePosixPath('my/library.tar.gz').suffixes
4407db96d56Sopenharmony_ci      ['.tar', '.gz']
4417db96d56Sopenharmony_ci      >>> PurePosixPath('my/library').suffixes
4427db96d56Sopenharmony_ci      []
4437db96d56Sopenharmony_ci
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci.. attribute:: PurePath.stem
4467db96d56Sopenharmony_ci
4477db96d56Sopenharmony_ci   The final path component, without its suffix::
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci      >>> PurePosixPath('my/library.tar.gz').stem
4507db96d56Sopenharmony_ci      'library.tar'
4517db96d56Sopenharmony_ci      >>> PurePosixPath('my/library.tar').stem
4527db96d56Sopenharmony_ci      'library'
4537db96d56Sopenharmony_ci      >>> PurePosixPath('my/library').stem
4547db96d56Sopenharmony_ci      'library'
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci.. method:: PurePath.as_posix()
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci   Return a string representation of the path with forward slashes (``/``)::
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:\\windows')
4627db96d56Sopenharmony_ci      >>> str(p)
4637db96d56Sopenharmony_ci      'c:\\windows'
4647db96d56Sopenharmony_ci      >>> p.as_posix()
4657db96d56Sopenharmony_ci      'c:/windows'
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci.. method:: PurePath.as_uri()
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci   Represent the path as a ``file`` URI.  :exc:`ValueError` is raised if
4717db96d56Sopenharmony_ci   the path isn't absolute.
4727db96d56Sopenharmony_ci
4737db96d56Sopenharmony_ci      >>> p = PurePosixPath('/etc/passwd')
4747db96d56Sopenharmony_ci      >>> p.as_uri()
4757db96d56Sopenharmony_ci      'file:///etc/passwd'
4767db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/Windows')
4777db96d56Sopenharmony_ci      >>> p.as_uri()
4787db96d56Sopenharmony_ci      'file:///c:/Windows'
4797db96d56Sopenharmony_ci
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci.. method:: PurePath.is_absolute()
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci   Return whether the path is absolute or not.  A path is considered absolute
4847db96d56Sopenharmony_ci   if it has both a root and (if the flavour allows) a drive::
4857db96d56Sopenharmony_ci
4867db96d56Sopenharmony_ci      >>> PurePosixPath('/a/b').is_absolute()
4877db96d56Sopenharmony_ci      True
4887db96d56Sopenharmony_ci      >>> PurePosixPath('a/b').is_absolute()
4897db96d56Sopenharmony_ci      False
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci      >>> PureWindowsPath('c:/a/b').is_absolute()
4927db96d56Sopenharmony_ci      True
4937db96d56Sopenharmony_ci      >>> PureWindowsPath('/a/b').is_absolute()
4947db96d56Sopenharmony_ci      False
4957db96d56Sopenharmony_ci      >>> PureWindowsPath('c:').is_absolute()
4967db96d56Sopenharmony_ci      False
4977db96d56Sopenharmony_ci      >>> PureWindowsPath('//some/share').is_absolute()
4987db96d56Sopenharmony_ci      True
4997db96d56Sopenharmony_ci
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci.. method:: PurePath.is_relative_to(*other)
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci   Return whether or not this path is relative to the *other* path.
5047db96d56Sopenharmony_ci
5057db96d56Sopenharmony_ci      >>> p = PurePath('/etc/passwd')
5067db96d56Sopenharmony_ci      >>> p.is_relative_to('/etc')
5077db96d56Sopenharmony_ci      True
5087db96d56Sopenharmony_ci      >>> p.is_relative_to('/usr')
5097db96d56Sopenharmony_ci      False
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci   .. versionadded:: 3.9
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ci.. method:: PurePath.is_reserved()
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci   With :class:`PureWindowsPath`, return ``True`` if the path is considered
5177db96d56Sopenharmony_ci   reserved under Windows, ``False`` otherwise.  With :class:`PurePosixPath`,
5187db96d56Sopenharmony_ci   ``False`` is always returned.
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci      >>> PureWindowsPath('nul').is_reserved()
5217db96d56Sopenharmony_ci      True
5227db96d56Sopenharmony_ci      >>> PurePosixPath('nul').is_reserved()
5237db96d56Sopenharmony_ci      False
5247db96d56Sopenharmony_ci
5257db96d56Sopenharmony_ci   File system calls on reserved paths can fail mysteriously or have
5267db96d56Sopenharmony_ci   unintended effects.
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci.. method:: PurePath.joinpath(*other)
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci   Calling this method is equivalent to combining the path with each of
5327db96d56Sopenharmony_ci   the *other* arguments in turn::
5337db96d56Sopenharmony_ci
5347db96d56Sopenharmony_ci      >>> PurePosixPath('/etc').joinpath('passwd')
5357db96d56Sopenharmony_ci      PurePosixPath('/etc/passwd')
5367db96d56Sopenharmony_ci      >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
5377db96d56Sopenharmony_ci      PurePosixPath('/etc/passwd')
5387db96d56Sopenharmony_ci      >>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
5397db96d56Sopenharmony_ci      PurePosixPath('/etc/init.d/apache2')
5407db96d56Sopenharmony_ci      >>> PureWindowsPath('c:').joinpath('/Program Files')
5417db96d56Sopenharmony_ci      PureWindowsPath('c:/Program Files')
5427db96d56Sopenharmony_ci
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci.. method:: PurePath.match(pattern)
5457db96d56Sopenharmony_ci
5467db96d56Sopenharmony_ci   Match this path against the provided glob-style pattern.  Return ``True``
5477db96d56Sopenharmony_ci   if matching is successful, ``False`` otherwise.
5487db96d56Sopenharmony_ci
5497db96d56Sopenharmony_ci   If *pattern* is relative, the path can be either relative or absolute,
5507db96d56Sopenharmony_ci   and matching is done from the right::
5517db96d56Sopenharmony_ci
5527db96d56Sopenharmony_ci      >>> PurePath('a/b.py').match('*.py')
5537db96d56Sopenharmony_ci      True
5547db96d56Sopenharmony_ci      >>> PurePath('/a/b/c.py').match('b/*.py')
5557db96d56Sopenharmony_ci      True
5567db96d56Sopenharmony_ci      >>> PurePath('/a/b/c.py').match('a/*.py')
5577db96d56Sopenharmony_ci      False
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci   If *pattern* is absolute, the path must be absolute, and the whole path
5607db96d56Sopenharmony_ci   must match::
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ci      >>> PurePath('/a.py').match('/*.py')
5637db96d56Sopenharmony_ci      True
5647db96d56Sopenharmony_ci      >>> PurePath('a/b.py').match('/*.py')
5657db96d56Sopenharmony_ci      False
5667db96d56Sopenharmony_ci
5677db96d56Sopenharmony_ci   As with other methods, case-sensitivity follows platform defaults::
5687db96d56Sopenharmony_ci
5697db96d56Sopenharmony_ci      >>> PurePosixPath('b.py').match('*.PY')
5707db96d56Sopenharmony_ci      False
5717db96d56Sopenharmony_ci      >>> PureWindowsPath('b.py').match('*.PY')
5727db96d56Sopenharmony_ci      True
5737db96d56Sopenharmony_ci
5747db96d56Sopenharmony_ci
5757db96d56Sopenharmony_ci.. method:: PurePath.relative_to(*other)
5767db96d56Sopenharmony_ci
5777db96d56Sopenharmony_ci   Compute a version of this path relative to the path represented by
5787db96d56Sopenharmony_ci   *other*.  If it's impossible, ValueError is raised::
5797db96d56Sopenharmony_ci
5807db96d56Sopenharmony_ci      >>> p = PurePosixPath('/etc/passwd')
5817db96d56Sopenharmony_ci      >>> p.relative_to('/')
5827db96d56Sopenharmony_ci      PurePosixPath('etc/passwd')
5837db96d56Sopenharmony_ci      >>> p.relative_to('/etc')
5847db96d56Sopenharmony_ci      PurePosixPath('passwd')
5857db96d56Sopenharmony_ci      >>> p.relative_to('/usr')
5867db96d56Sopenharmony_ci      Traceback (most recent call last):
5877db96d56Sopenharmony_ci        File "<stdin>", line 1, in <module>
5887db96d56Sopenharmony_ci        File "pathlib.py", line 694, in relative_to
5897db96d56Sopenharmony_ci          .format(str(self), str(formatted)))
5907db96d56Sopenharmony_ci      ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other absolute.
5917db96d56Sopenharmony_ci
5927db96d56Sopenharmony_ci   NOTE: This function is part of :class:`PurePath` and works with strings. It does not check or access the underlying file structure.
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci
5957db96d56Sopenharmony_ci.. method:: PurePath.with_name(name)
5967db96d56Sopenharmony_ci
5977db96d56Sopenharmony_ci   Return a new path with the :attr:`name` changed.  If the original path
5987db96d56Sopenharmony_ci   doesn't have a name, ValueError is raised::
5997db96d56Sopenharmony_ci
6007db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
6017db96d56Sopenharmony_ci      >>> p.with_name('setup.py')
6027db96d56Sopenharmony_ci      PureWindowsPath('c:/Downloads/setup.py')
6037db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/')
6047db96d56Sopenharmony_ci      >>> p.with_name('setup.py')
6057db96d56Sopenharmony_ci      Traceback (most recent call last):
6067db96d56Sopenharmony_ci        File "<stdin>", line 1, in <module>
6077db96d56Sopenharmony_ci        File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
6087db96d56Sopenharmony_ci          raise ValueError("%r has an empty name" % (self,))
6097db96d56Sopenharmony_ci      ValueError: PureWindowsPath('c:/') has an empty name
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci
6127db96d56Sopenharmony_ci.. method:: PurePath.with_stem(stem)
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ci   Return a new path with the :attr:`stem` changed.  If the original path
6157db96d56Sopenharmony_ci   doesn't have a name, ValueError is raised::
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/Downloads/draft.txt')
6187db96d56Sopenharmony_ci      >>> p.with_stem('final')
6197db96d56Sopenharmony_ci      PureWindowsPath('c:/Downloads/final.txt')
6207db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
6217db96d56Sopenharmony_ci      >>> p.with_stem('lib')
6227db96d56Sopenharmony_ci      PureWindowsPath('c:/Downloads/lib.gz')
6237db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/')
6247db96d56Sopenharmony_ci      >>> p.with_stem('')
6257db96d56Sopenharmony_ci      Traceback (most recent call last):
6267db96d56Sopenharmony_ci        File "<stdin>", line 1, in <module>
6277db96d56Sopenharmony_ci        File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem
6287db96d56Sopenharmony_ci          return self.with_name(stem + self.suffix)
6297db96d56Sopenharmony_ci        File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name
6307db96d56Sopenharmony_ci          raise ValueError("%r has an empty name" % (self,))
6317db96d56Sopenharmony_ci      ValueError: PureWindowsPath('c:/') has an empty name
6327db96d56Sopenharmony_ci
6337db96d56Sopenharmony_ci   .. versionadded:: 3.9
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci
6367db96d56Sopenharmony_ci.. method:: PurePath.with_suffix(suffix)
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci   Return a new path with the :attr:`suffix` changed.  If the original path
6397db96d56Sopenharmony_ci   doesn't have a suffix, the new *suffix* is appended instead.  If the
6407db96d56Sopenharmony_ci   *suffix* is an empty string, the original suffix is removed::
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ci      >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
6437db96d56Sopenharmony_ci      >>> p.with_suffix('.bz2')
6447db96d56Sopenharmony_ci      PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
6457db96d56Sopenharmony_ci      >>> p = PureWindowsPath('README')
6467db96d56Sopenharmony_ci      >>> p.with_suffix('.txt')
6477db96d56Sopenharmony_ci      PureWindowsPath('README.txt')
6487db96d56Sopenharmony_ci      >>> p = PureWindowsPath('README.txt')
6497db96d56Sopenharmony_ci      >>> p.with_suffix('')
6507db96d56Sopenharmony_ci      PureWindowsPath('README')
6517db96d56Sopenharmony_ci
6527db96d56Sopenharmony_ci
6537db96d56Sopenharmony_ci.. _concrete-paths:
6547db96d56Sopenharmony_ci
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ciConcrete paths
6577db96d56Sopenharmony_ci--------------
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ciConcrete paths are subclasses of the pure path classes.  In addition to
6607db96d56Sopenharmony_cioperations provided by the latter, they also provide methods to do system
6617db96d56Sopenharmony_cicalls on path objects.  There are three ways to instantiate concrete paths:
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ci.. class:: Path(*pathsegments)
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci   A subclass of :class:`PurePath`, this class represents concrete paths of
6667db96d56Sopenharmony_ci   the system's path flavour (instantiating it creates either a
6677db96d56Sopenharmony_ci   :class:`PosixPath` or a :class:`WindowsPath`)::
6687db96d56Sopenharmony_ci
6697db96d56Sopenharmony_ci      >>> Path('setup.py')
6707db96d56Sopenharmony_ci      PosixPath('setup.py')
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci   *pathsegments* is specified similarly to :class:`PurePath`.
6737db96d56Sopenharmony_ci
6747db96d56Sopenharmony_ci.. class:: PosixPath(*pathsegments)
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci   A subclass of :class:`Path` and :class:`PurePosixPath`, this class
6777db96d56Sopenharmony_ci   represents concrete non-Windows filesystem paths::
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci      >>> PosixPath('/etc')
6807db96d56Sopenharmony_ci      PosixPath('/etc')
6817db96d56Sopenharmony_ci
6827db96d56Sopenharmony_ci   *pathsegments* is specified similarly to :class:`PurePath`.
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ci.. class:: WindowsPath(*pathsegments)
6857db96d56Sopenharmony_ci
6867db96d56Sopenharmony_ci   A subclass of :class:`Path` and :class:`PureWindowsPath`, this class
6877db96d56Sopenharmony_ci   represents concrete Windows filesystem paths::
6887db96d56Sopenharmony_ci
6897db96d56Sopenharmony_ci      >>> WindowsPath('c:/Program Files/')
6907db96d56Sopenharmony_ci      WindowsPath('c:/Program Files')
6917db96d56Sopenharmony_ci
6927db96d56Sopenharmony_ci   *pathsegments* is specified similarly to :class:`PurePath`.
6937db96d56Sopenharmony_ci
6947db96d56Sopenharmony_ciYou can only instantiate the class flavour that corresponds to your system
6957db96d56Sopenharmony_ci(allowing system calls on non-compatible path flavours could lead to
6967db96d56Sopenharmony_cibugs or failures in your application)::
6977db96d56Sopenharmony_ci
6987db96d56Sopenharmony_ci   >>> import os
6997db96d56Sopenharmony_ci   >>> os.name
7007db96d56Sopenharmony_ci   'posix'
7017db96d56Sopenharmony_ci   >>> Path('setup.py')
7027db96d56Sopenharmony_ci   PosixPath('setup.py')
7037db96d56Sopenharmony_ci   >>> PosixPath('setup.py')
7047db96d56Sopenharmony_ci   PosixPath('setup.py')
7057db96d56Sopenharmony_ci   >>> WindowsPath('setup.py')
7067db96d56Sopenharmony_ci   Traceback (most recent call last):
7077db96d56Sopenharmony_ci     File "<stdin>", line 1, in <module>
7087db96d56Sopenharmony_ci     File "pathlib.py", line 798, in __new__
7097db96d56Sopenharmony_ci       % (cls.__name__,))
7107db96d56Sopenharmony_ci   NotImplementedError: cannot instantiate 'WindowsPath' on your system
7117db96d56Sopenharmony_ci
7127db96d56Sopenharmony_ci
7137db96d56Sopenharmony_ciMethods
7147db96d56Sopenharmony_ci^^^^^^^
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ciConcrete paths provide the following methods in addition to pure paths
7177db96d56Sopenharmony_cimethods.  Many of these methods can raise an :exc:`OSError` if a system
7187db96d56Sopenharmony_cicall fails (for example because the path doesn't exist).
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ci.. versionchanged:: 3.8
7217db96d56Sopenharmony_ci
7227db96d56Sopenharmony_ci   :meth:`~Path.exists()`, :meth:`~Path.is_dir()`, :meth:`~Path.is_file()`,
7237db96d56Sopenharmony_ci   :meth:`~Path.is_mount()`, :meth:`~Path.is_symlink()`,
7247db96d56Sopenharmony_ci   :meth:`~Path.is_block_device()`, :meth:`~Path.is_char_device()`,
7257db96d56Sopenharmony_ci   :meth:`~Path.is_fifo()`, :meth:`~Path.is_socket()` now return ``False``
7267db96d56Sopenharmony_ci   instead of raising an exception for paths that contain characters
7277db96d56Sopenharmony_ci   unrepresentable at the OS level.
7287db96d56Sopenharmony_ci
7297db96d56Sopenharmony_ci
7307db96d56Sopenharmony_ci.. classmethod:: Path.cwd()
7317db96d56Sopenharmony_ci
7327db96d56Sopenharmony_ci   Return a new path object representing the current directory (as returned
7337db96d56Sopenharmony_ci   by :func:`os.getcwd`)::
7347db96d56Sopenharmony_ci
7357db96d56Sopenharmony_ci      >>> Path.cwd()
7367db96d56Sopenharmony_ci      PosixPath('/home/antoine/pathlib')
7377db96d56Sopenharmony_ci
7387db96d56Sopenharmony_ci
7397db96d56Sopenharmony_ci.. classmethod:: Path.home()
7407db96d56Sopenharmony_ci
7417db96d56Sopenharmony_ci   Return a new path object representing the user's home directory (as
7427db96d56Sopenharmony_ci   returned by :func:`os.path.expanduser` with ``~`` construct). If the home
7437db96d56Sopenharmony_ci   directory can't be resolved, :exc:`RuntimeError` is raised.
7447db96d56Sopenharmony_ci
7457db96d56Sopenharmony_ci   ::
7467db96d56Sopenharmony_ci
7477db96d56Sopenharmony_ci      >>> Path.home()
7487db96d56Sopenharmony_ci      PosixPath('/home/antoine')
7497db96d56Sopenharmony_ci
7507db96d56Sopenharmony_ci   .. versionadded:: 3.5
7517db96d56Sopenharmony_ci
7527db96d56Sopenharmony_ci
7537db96d56Sopenharmony_ci.. method:: Path.stat(*, follow_symlinks=True)
7547db96d56Sopenharmony_ci
7557db96d56Sopenharmony_ci   Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`.
7567db96d56Sopenharmony_ci   The result is looked up at each call to this method.
7577db96d56Sopenharmony_ci
7587db96d56Sopenharmony_ci   This method normally follows symlinks; to stat a symlink add the argument
7597db96d56Sopenharmony_ci   ``follow_symlinks=False``, or use :meth:`~Path.lstat`.
7607db96d56Sopenharmony_ci
7617db96d56Sopenharmony_ci   ::
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ci      >>> p = Path('setup.py')
7647db96d56Sopenharmony_ci      >>> p.stat().st_size
7657db96d56Sopenharmony_ci      956
7667db96d56Sopenharmony_ci      >>> p.stat().st_mtime
7677db96d56Sopenharmony_ci      1327883547.852554
7687db96d56Sopenharmony_ci
7697db96d56Sopenharmony_ci   .. versionchanged:: 3.10
7707db96d56Sopenharmony_ci      The *follow_symlinks* parameter was added.
7717db96d56Sopenharmony_ci
7727db96d56Sopenharmony_ci.. method:: Path.chmod(mode, *, follow_symlinks=True)
7737db96d56Sopenharmony_ci
7747db96d56Sopenharmony_ci   Change the file mode and permissions, like :func:`os.chmod`.
7757db96d56Sopenharmony_ci
7767db96d56Sopenharmony_ci   This method normally follows symlinks. Some Unix flavours support changing
7777db96d56Sopenharmony_ci   permissions on the symlink itself; on these platforms you may add the
7787db96d56Sopenharmony_ci   argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`.
7797db96d56Sopenharmony_ci
7807db96d56Sopenharmony_ci   ::
7817db96d56Sopenharmony_ci
7827db96d56Sopenharmony_ci      >>> p = Path('setup.py')
7837db96d56Sopenharmony_ci      >>> p.stat().st_mode
7847db96d56Sopenharmony_ci      33277
7857db96d56Sopenharmony_ci      >>> p.chmod(0o444)
7867db96d56Sopenharmony_ci      >>> p.stat().st_mode
7877db96d56Sopenharmony_ci      33060
7887db96d56Sopenharmony_ci
7897db96d56Sopenharmony_ci   .. versionchanged:: 3.10
7907db96d56Sopenharmony_ci      The *follow_symlinks* parameter was added.
7917db96d56Sopenharmony_ci
7927db96d56Sopenharmony_ci.. method:: Path.exists()
7937db96d56Sopenharmony_ci
7947db96d56Sopenharmony_ci   Whether the path points to an existing file or directory::
7957db96d56Sopenharmony_ci
7967db96d56Sopenharmony_ci      >>> Path('.').exists()
7977db96d56Sopenharmony_ci      True
7987db96d56Sopenharmony_ci      >>> Path('setup.py').exists()
7997db96d56Sopenharmony_ci      True
8007db96d56Sopenharmony_ci      >>> Path('/etc').exists()
8017db96d56Sopenharmony_ci      True
8027db96d56Sopenharmony_ci      >>> Path('nonexistentfile').exists()
8037db96d56Sopenharmony_ci      False
8047db96d56Sopenharmony_ci
8057db96d56Sopenharmony_ci   .. note::
8067db96d56Sopenharmony_ci      If the path points to a symlink, :meth:`exists` returns whether the
8077db96d56Sopenharmony_ci      symlink *points to* an existing file or directory.
8087db96d56Sopenharmony_ci
8097db96d56Sopenharmony_ci
8107db96d56Sopenharmony_ci.. method:: Path.expanduser()
8117db96d56Sopenharmony_ci
8127db96d56Sopenharmony_ci   Return a new path with expanded ``~`` and ``~user`` constructs,
8137db96d56Sopenharmony_ci   as returned by :meth:`os.path.expanduser`. If a home directory can't be
8147db96d56Sopenharmony_ci   resolved, :exc:`RuntimeError` is raised.
8157db96d56Sopenharmony_ci
8167db96d56Sopenharmony_ci   ::
8177db96d56Sopenharmony_ci
8187db96d56Sopenharmony_ci      >>> p = PosixPath('~/films/Monty Python')
8197db96d56Sopenharmony_ci      >>> p.expanduser()
8207db96d56Sopenharmony_ci      PosixPath('/home/eric/films/Monty Python')
8217db96d56Sopenharmony_ci
8227db96d56Sopenharmony_ci   .. versionadded:: 3.5
8237db96d56Sopenharmony_ci
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci.. method:: Path.glob(pattern)
8267db96d56Sopenharmony_ci
8277db96d56Sopenharmony_ci   Glob the given relative *pattern* in the directory represented by this path,
8287db96d56Sopenharmony_ci   yielding all matching files (of any kind)::
8297db96d56Sopenharmony_ci
8307db96d56Sopenharmony_ci      >>> sorted(Path('.').glob('*.py'))
8317db96d56Sopenharmony_ci      [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
8327db96d56Sopenharmony_ci      >>> sorted(Path('.').glob('*/*.py'))
8337db96d56Sopenharmony_ci      [PosixPath('docs/conf.py')]
8347db96d56Sopenharmony_ci
8357db96d56Sopenharmony_ci   Patterns are the same as for :mod:`fnmatch`, with the addition of "``**``"
8367db96d56Sopenharmony_ci   which means "this directory and all subdirectories, recursively".  In other
8377db96d56Sopenharmony_ci   words, it enables recursive globbing::
8387db96d56Sopenharmony_ci
8397db96d56Sopenharmony_ci      >>> sorted(Path('.').glob('**/*.py'))
8407db96d56Sopenharmony_ci      [PosixPath('build/lib/pathlib.py'),
8417db96d56Sopenharmony_ci       PosixPath('docs/conf.py'),
8427db96d56Sopenharmony_ci       PosixPath('pathlib.py'),
8437db96d56Sopenharmony_ci       PosixPath('setup.py'),
8447db96d56Sopenharmony_ci       PosixPath('test_pathlib.py')]
8457db96d56Sopenharmony_ci
8467db96d56Sopenharmony_ci   .. note::
8477db96d56Sopenharmony_ci      Using the "``**``" pattern in large directory trees may consume
8487db96d56Sopenharmony_ci      an inordinate amount of time.
8497db96d56Sopenharmony_ci
8507db96d56Sopenharmony_ci   .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob
8517db96d56Sopenharmony_ci
8527db96d56Sopenharmony_ci   .. versionchanged:: 3.11
8537db96d56Sopenharmony_ci      Return only directories if *pattern* ends with a pathname components
8547db96d56Sopenharmony_ci      separator (:data:`~os.sep` or :data:`~os.altsep`).
8557db96d56Sopenharmony_ci
8567db96d56Sopenharmony_ci.. method:: Path.group()
8577db96d56Sopenharmony_ci
8587db96d56Sopenharmony_ci   Return the name of the group owning the file.  :exc:`KeyError` is raised
8597db96d56Sopenharmony_ci   if the file's gid isn't found in the system database.
8607db96d56Sopenharmony_ci
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ci.. method:: Path.is_dir()
8637db96d56Sopenharmony_ci
8647db96d56Sopenharmony_ci   Return ``True`` if the path points to a directory (or a symbolic link
8657db96d56Sopenharmony_ci   pointing to a directory), ``False`` if it points to another kind of file.
8667db96d56Sopenharmony_ci
8677db96d56Sopenharmony_ci   ``False`` is also returned if the path doesn't exist or is a broken symlink;
8687db96d56Sopenharmony_ci   other errors (such as permission errors) are propagated.
8697db96d56Sopenharmony_ci
8707db96d56Sopenharmony_ci
8717db96d56Sopenharmony_ci.. method:: Path.is_file()
8727db96d56Sopenharmony_ci
8737db96d56Sopenharmony_ci   Return ``True`` if the path points to a regular file (or a symbolic link
8747db96d56Sopenharmony_ci   pointing to a regular file), ``False`` if it points to another kind of file.
8757db96d56Sopenharmony_ci
8767db96d56Sopenharmony_ci   ``False`` is also returned if the path doesn't exist or is a broken symlink;
8777db96d56Sopenharmony_ci   other errors (such as permission errors) are propagated.
8787db96d56Sopenharmony_ci
8797db96d56Sopenharmony_ci
8807db96d56Sopenharmony_ci.. method:: Path.is_mount()
8817db96d56Sopenharmony_ci
8827db96d56Sopenharmony_ci   Return ``True`` if the path is a :dfn:`mount point`: a point in a
8837db96d56Sopenharmony_ci   file system where a different file system has been mounted.  On POSIX, the
8847db96d56Sopenharmony_ci   function checks whether *path*'s parent, :file:`path/..`, is on a different
8857db96d56Sopenharmony_ci   device than *path*, or whether :file:`path/..` and *path* point to the same
8867db96d56Sopenharmony_ci   i-node on the same device --- this should detect mount points for all Unix
8877db96d56Sopenharmony_ci   and POSIX variants.  Not implemented on Windows.
8887db96d56Sopenharmony_ci
8897db96d56Sopenharmony_ci   .. versionadded:: 3.7
8907db96d56Sopenharmony_ci
8917db96d56Sopenharmony_ci
8927db96d56Sopenharmony_ci.. method:: Path.is_symlink()
8937db96d56Sopenharmony_ci
8947db96d56Sopenharmony_ci   Return ``True`` if the path points to a symbolic link, ``False`` otherwise.
8957db96d56Sopenharmony_ci
8967db96d56Sopenharmony_ci   ``False`` is also returned if the path doesn't exist; other errors (such
8977db96d56Sopenharmony_ci   as permission errors) are propagated.
8987db96d56Sopenharmony_ci
8997db96d56Sopenharmony_ci
9007db96d56Sopenharmony_ci.. method:: Path.is_socket()
9017db96d56Sopenharmony_ci
9027db96d56Sopenharmony_ci   Return ``True`` if the path points to a Unix socket (or a symbolic link
9037db96d56Sopenharmony_ci   pointing to a Unix socket), ``False`` if it points to another kind of file.
9047db96d56Sopenharmony_ci
9057db96d56Sopenharmony_ci   ``False`` is also returned if the path doesn't exist or is a broken symlink;
9067db96d56Sopenharmony_ci   other errors (such as permission errors) are propagated.
9077db96d56Sopenharmony_ci
9087db96d56Sopenharmony_ci
9097db96d56Sopenharmony_ci.. method:: Path.is_fifo()
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ci   Return ``True`` if the path points to a FIFO (or a symbolic link
9127db96d56Sopenharmony_ci   pointing to a FIFO), ``False`` if it points to another kind of file.
9137db96d56Sopenharmony_ci
9147db96d56Sopenharmony_ci   ``False`` is also returned if the path doesn't exist or is a broken symlink;
9157db96d56Sopenharmony_ci   other errors (such as permission errors) are propagated.
9167db96d56Sopenharmony_ci
9177db96d56Sopenharmony_ci
9187db96d56Sopenharmony_ci.. method:: Path.is_block_device()
9197db96d56Sopenharmony_ci
9207db96d56Sopenharmony_ci   Return ``True`` if the path points to a block device (or a symbolic link
9217db96d56Sopenharmony_ci   pointing to a block device), ``False`` if it points to another kind of file.
9227db96d56Sopenharmony_ci
9237db96d56Sopenharmony_ci   ``False`` is also returned if the path doesn't exist or is a broken symlink;
9247db96d56Sopenharmony_ci   other errors (such as permission errors) are propagated.
9257db96d56Sopenharmony_ci
9267db96d56Sopenharmony_ci
9277db96d56Sopenharmony_ci.. method:: Path.is_char_device()
9287db96d56Sopenharmony_ci
9297db96d56Sopenharmony_ci   Return ``True`` if the path points to a character device (or a symbolic link
9307db96d56Sopenharmony_ci   pointing to a character device), ``False`` if it points to another kind of file.
9317db96d56Sopenharmony_ci
9327db96d56Sopenharmony_ci   ``False`` is also returned if the path doesn't exist or is a broken symlink;
9337db96d56Sopenharmony_ci   other errors (such as permission errors) are propagated.
9347db96d56Sopenharmony_ci
9357db96d56Sopenharmony_ci
9367db96d56Sopenharmony_ci.. method:: Path.iterdir()
9377db96d56Sopenharmony_ci
9387db96d56Sopenharmony_ci   When the path points to a directory, yield path objects of the directory
9397db96d56Sopenharmony_ci   contents::
9407db96d56Sopenharmony_ci
9417db96d56Sopenharmony_ci      >>> p = Path('docs')
9427db96d56Sopenharmony_ci      >>> for child in p.iterdir(): child
9437db96d56Sopenharmony_ci      ...
9447db96d56Sopenharmony_ci      PosixPath('docs/conf.py')
9457db96d56Sopenharmony_ci      PosixPath('docs/_templates')
9467db96d56Sopenharmony_ci      PosixPath('docs/make.bat')
9477db96d56Sopenharmony_ci      PosixPath('docs/index.rst')
9487db96d56Sopenharmony_ci      PosixPath('docs/_build')
9497db96d56Sopenharmony_ci      PosixPath('docs/_static')
9507db96d56Sopenharmony_ci      PosixPath('docs/Makefile')
9517db96d56Sopenharmony_ci
9527db96d56Sopenharmony_ci   The children are yielded in arbitrary order, and the special entries
9537db96d56Sopenharmony_ci   ``'.'`` and ``'..'`` are not included.  If a file is removed from or added
9547db96d56Sopenharmony_ci   to the directory after creating the iterator, whether a path object for
9557db96d56Sopenharmony_ci   that file be included is unspecified.
9567db96d56Sopenharmony_ci
9577db96d56Sopenharmony_ci.. method:: Path.lchmod(mode)
9587db96d56Sopenharmony_ci
9597db96d56Sopenharmony_ci   Like :meth:`Path.chmod` but, if the path points to a symbolic link, the
9607db96d56Sopenharmony_ci   symbolic link's mode is changed rather than its target's.
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ci
9637db96d56Sopenharmony_ci.. method:: Path.lstat()
9647db96d56Sopenharmony_ci
9657db96d56Sopenharmony_ci   Like :meth:`Path.stat` but, if the path points to a symbolic link, return
9667db96d56Sopenharmony_ci   the symbolic link's information rather than its target's.
9677db96d56Sopenharmony_ci
9687db96d56Sopenharmony_ci
9697db96d56Sopenharmony_ci.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False)
9707db96d56Sopenharmony_ci
9717db96d56Sopenharmony_ci   Create a new directory at this given path.  If *mode* is given, it is
9727db96d56Sopenharmony_ci   combined with the process' ``umask`` value to determine the file mode
9737db96d56Sopenharmony_ci   and access flags.  If the path already exists, :exc:`FileExistsError`
9747db96d56Sopenharmony_ci   is raised.
9757db96d56Sopenharmony_ci
9767db96d56Sopenharmony_ci   If *parents* is true, any missing parents of this path are created
9777db96d56Sopenharmony_ci   as needed; they are created with the default permissions without taking
9787db96d56Sopenharmony_ci   *mode* into account (mimicking the POSIX ``mkdir -p`` command).
9797db96d56Sopenharmony_ci
9807db96d56Sopenharmony_ci   If *parents* is false (the default), a missing parent raises
9817db96d56Sopenharmony_ci   :exc:`FileNotFoundError`.
9827db96d56Sopenharmony_ci
9837db96d56Sopenharmony_ci   If *exist_ok* is false (the default), :exc:`FileExistsError` is
9847db96d56Sopenharmony_ci   raised if the target directory already exists.
9857db96d56Sopenharmony_ci
9867db96d56Sopenharmony_ci   If *exist_ok* is true, :exc:`FileExistsError` exceptions will be
9877db96d56Sopenharmony_ci   ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the
9887db96d56Sopenharmony_ci   last path component is not an existing non-directory file.
9897db96d56Sopenharmony_ci
9907db96d56Sopenharmony_ci   .. versionchanged:: 3.5
9917db96d56Sopenharmony_ci      The *exist_ok* parameter was added.
9927db96d56Sopenharmony_ci
9937db96d56Sopenharmony_ci
9947db96d56Sopenharmony_ci.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
9957db96d56Sopenharmony_ci
9967db96d56Sopenharmony_ci   Open the file pointed to by the path, like the built-in :func:`open`
9977db96d56Sopenharmony_ci   function does::
9987db96d56Sopenharmony_ci
9997db96d56Sopenharmony_ci      >>> p = Path('setup.py')
10007db96d56Sopenharmony_ci      >>> with p.open() as f:
10017db96d56Sopenharmony_ci      ...     f.readline()
10027db96d56Sopenharmony_ci      ...
10037db96d56Sopenharmony_ci      '#!/usr/bin/env python3\n'
10047db96d56Sopenharmony_ci
10057db96d56Sopenharmony_ci
10067db96d56Sopenharmony_ci.. method:: Path.owner()
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ci   Return the name of the user owning the file.  :exc:`KeyError` is raised
10097db96d56Sopenharmony_ci   if the file's uid isn't found in the system database.
10107db96d56Sopenharmony_ci
10117db96d56Sopenharmony_ci
10127db96d56Sopenharmony_ci.. method:: Path.read_bytes()
10137db96d56Sopenharmony_ci
10147db96d56Sopenharmony_ci   Return the binary contents of the pointed-to file as a bytes object::
10157db96d56Sopenharmony_ci
10167db96d56Sopenharmony_ci      >>> p = Path('my_binary_file')
10177db96d56Sopenharmony_ci      >>> p.write_bytes(b'Binary file contents')
10187db96d56Sopenharmony_ci      20
10197db96d56Sopenharmony_ci      >>> p.read_bytes()
10207db96d56Sopenharmony_ci      b'Binary file contents'
10217db96d56Sopenharmony_ci
10227db96d56Sopenharmony_ci   .. versionadded:: 3.5
10237db96d56Sopenharmony_ci
10247db96d56Sopenharmony_ci
10257db96d56Sopenharmony_ci.. method:: Path.read_text(encoding=None, errors=None)
10267db96d56Sopenharmony_ci
10277db96d56Sopenharmony_ci   Return the decoded contents of the pointed-to file as a string::
10287db96d56Sopenharmony_ci
10297db96d56Sopenharmony_ci      >>> p = Path('my_text_file')
10307db96d56Sopenharmony_ci      >>> p.write_text('Text file contents')
10317db96d56Sopenharmony_ci      18
10327db96d56Sopenharmony_ci      >>> p.read_text()
10337db96d56Sopenharmony_ci      'Text file contents'
10347db96d56Sopenharmony_ci
10357db96d56Sopenharmony_ci   The file is opened and then closed. The optional parameters have the same
10367db96d56Sopenharmony_ci   meaning as in :func:`open`.
10377db96d56Sopenharmony_ci
10387db96d56Sopenharmony_ci   .. versionadded:: 3.5
10397db96d56Sopenharmony_ci
10407db96d56Sopenharmony_ci
10417db96d56Sopenharmony_ci.. method:: Path.readlink()
10427db96d56Sopenharmony_ci
10437db96d56Sopenharmony_ci   Return the path to which the symbolic link points (as returned by
10447db96d56Sopenharmony_ci   :func:`os.readlink`)::
10457db96d56Sopenharmony_ci
10467db96d56Sopenharmony_ci      >>> p = Path('mylink')
10477db96d56Sopenharmony_ci      >>> p.symlink_to('setup.py')
10487db96d56Sopenharmony_ci      >>> p.readlink()
10497db96d56Sopenharmony_ci      PosixPath('setup.py')
10507db96d56Sopenharmony_ci
10517db96d56Sopenharmony_ci   .. versionadded:: 3.9
10527db96d56Sopenharmony_ci
10537db96d56Sopenharmony_ci
10547db96d56Sopenharmony_ci.. method:: Path.rename(target)
10557db96d56Sopenharmony_ci
10567db96d56Sopenharmony_ci   Rename this file or directory to the given *target*, and return a new Path
10577db96d56Sopenharmony_ci   instance pointing to *target*.  On Unix, if *target* exists and is a file,
10587db96d56Sopenharmony_ci   it will be replaced silently if the user has permission.
10597db96d56Sopenharmony_ci   On Windows, if *target* exists, :exc:`FileExistsError` will be raised.
10607db96d56Sopenharmony_ci   *target* can be either a string or another path object::
10617db96d56Sopenharmony_ci
10627db96d56Sopenharmony_ci      >>> p = Path('foo')
10637db96d56Sopenharmony_ci      >>> p.open('w').write('some text')
10647db96d56Sopenharmony_ci      9
10657db96d56Sopenharmony_ci      >>> target = Path('bar')
10667db96d56Sopenharmony_ci      >>> p.rename(target)
10677db96d56Sopenharmony_ci      PosixPath('bar')
10687db96d56Sopenharmony_ci      >>> target.open().read()
10697db96d56Sopenharmony_ci      'some text'
10707db96d56Sopenharmony_ci
10717db96d56Sopenharmony_ci   The target path may be absolute or relative. Relative paths are interpreted
10727db96d56Sopenharmony_ci   relative to the current working directory, *not* the directory of the Path
10737db96d56Sopenharmony_ci   object.
10747db96d56Sopenharmony_ci
10757db96d56Sopenharmony_ci   It is implemented in terms of :func:`os.rename` and gives the same guarantees.
10767db96d56Sopenharmony_ci
10777db96d56Sopenharmony_ci   .. versionchanged:: 3.8
10787db96d56Sopenharmony_ci      Added return value, return the new Path instance.
10797db96d56Sopenharmony_ci
10807db96d56Sopenharmony_ci
10817db96d56Sopenharmony_ci.. method:: Path.replace(target)
10827db96d56Sopenharmony_ci
10837db96d56Sopenharmony_ci   Rename this file or directory to the given *target*, and return a new Path
10847db96d56Sopenharmony_ci   instance pointing to *target*.  If *target* points to an existing file or
10857db96d56Sopenharmony_ci   empty directory, it will be unconditionally replaced.
10867db96d56Sopenharmony_ci
10877db96d56Sopenharmony_ci   The target path may be absolute or relative. Relative paths are interpreted
10887db96d56Sopenharmony_ci   relative to the current working directory, *not* the directory of the Path
10897db96d56Sopenharmony_ci   object.
10907db96d56Sopenharmony_ci
10917db96d56Sopenharmony_ci   .. versionchanged:: 3.8
10927db96d56Sopenharmony_ci      Added return value, return the new Path instance.
10937db96d56Sopenharmony_ci
10947db96d56Sopenharmony_ci
10957db96d56Sopenharmony_ci.. method:: Path.absolute()
10967db96d56Sopenharmony_ci
10977db96d56Sopenharmony_ci   Make the path absolute, without normalization or resolving symlinks.
10987db96d56Sopenharmony_ci   Returns a new path object::
10997db96d56Sopenharmony_ci
11007db96d56Sopenharmony_ci      >>> p = Path('tests')
11017db96d56Sopenharmony_ci      >>> p
11027db96d56Sopenharmony_ci      PosixPath('tests')
11037db96d56Sopenharmony_ci      >>> p.absolute()
11047db96d56Sopenharmony_ci      PosixPath('/home/antoine/pathlib/tests')
11057db96d56Sopenharmony_ci
11067db96d56Sopenharmony_ci
11077db96d56Sopenharmony_ci.. method:: Path.resolve(strict=False)
11087db96d56Sopenharmony_ci
11097db96d56Sopenharmony_ci   Make the path absolute, resolving any symlinks.  A new path object is
11107db96d56Sopenharmony_ci   returned::
11117db96d56Sopenharmony_ci
11127db96d56Sopenharmony_ci      >>> p = Path()
11137db96d56Sopenharmony_ci      >>> p
11147db96d56Sopenharmony_ci      PosixPath('.')
11157db96d56Sopenharmony_ci      >>> p.resolve()
11167db96d56Sopenharmony_ci      PosixPath('/home/antoine/pathlib')
11177db96d56Sopenharmony_ci
11187db96d56Sopenharmony_ci   "``..``" components are also eliminated (this is the only method to do so)::
11197db96d56Sopenharmony_ci
11207db96d56Sopenharmony_ci      >>> p = Path('docs/../setup.py')
11217db96d56Sopenharmony_ci      >>> p.resolve()
11227db96d56Sopenharmony_ci      PosixPath('/home/antoine/pathlib/setup.py')
11237db96d56Sopenharmony_ci
11247db96d56Sopenharmony_ci   If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError`
11257db96d56Sopenharmony_ci   is raised.  If *strict* is ``False``, the path is resolved as far as possible
11267db96d56Sopenharmony_ci   and any remainder is appended without checking whether it exists.  If an
11277db96d56Sopenharmony_ci   infinite loop is encountered along the resolution path, :exc:`RuntimeError`
11287db96d56Sopenharmony_ci   is raised.
11297db96d56Sopenharmony_ci
11307db96d56Sopenharmony_ci   .. versionadded:: 3.6
11317db96d56Sopenharmony_ci      The *strict* argument (pre-3.6 behavior is strict).
11327db96d56Sopenharmony_ci
11337db96d56Sopenharmony_ci.. method:: Path.rglob(pattern)
11347db96d56Sopenharmony_ci
11357db96d56Sopenharmony_ci   This is like calling :func:`Path.glob` with "``**/``" added in front of the
11367db96d56Sopenharmony_ci   given relative *pattern*::
11377db96d56Sopenharmony_ci
11387db96d56Sopenharmony_ci      >>> sorted(Path().rglob("*.py"))
11397db96d56Sopenharmony_ci      [PosixPath('build/lib/pathlib.py'),
11407db96d56Sopenharmony_ci       PosixPath('docs/conf.py'),
11417db96d56Sopenharmony_ci       PosixPath('pathlib.py'),
11427db96d56Sopenharmony_ci       PosixPath('setup.py'),
11437db96d56Sopenharmony_ci       PosixPath('test_pathlib.py')]
11447db96d56Sopenharmony_ci
11457db96d56Sopenharmony_ci   .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob
11467db96d56Sopenharmony_ci
11477db96d56Sopenharmony_ci   .. versionchanged:: 3.11
11487db96d56Sopenharmony_ci      Return only directories if *pattern* ends with a pathname components
11497db96d56Sopenharmony_ci      separator (:data:`~os.sep` or :data:`~os.altsep`).
11507db96d56Sopenharmony_ci
11517db96d56Sopenharmony_ci.. method:: Path.rmdir()
11527db96d56Sopenharmony_ci
11537db96d56Sopenharmony_ci   Remove this directory.  The directory must be empty.
11547db96d56Sopenharmony_ci
11557db96d56Sopenharmony_ci
11567db96d56Sopenharmony_ci.. method:: Path.samefile(other_path)
11577db96d56Sopenharmony_ci
11587db96d56Sopenharmony_ci   Return whether this path points to the same file as *other_path*, which
11597db96d56Sopenharmony_ci   can be either a Path object, or a string.  The semantics are similar
11607db96d56Sopenharmony_ci   to :func:`os.path.samefile` and :func:`os.path.samestat`.
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ci   An :exc:`OSError` can be raised if either file cannot be accessed for some
11637db96d56Sopenharmony_ci   reason.
11647db96d56Sopenharmony_ci
11657db96d56Sopenharmony_ci   ::
11667db96d56Sopenharmony_ci
11677db96d56Sopenharmony_ci      >>> p = Path('spam')
11687db96d56Sopenharmony_ci      >>> q = Path('eggs')
11697db96d56Sopenharmony_ci      >>> p.samefile(q)
11707db96d56Sopenharmony_ci      False
11717db96d56Sopenharmony_ci      >>> p.samefile('spam')
11727db96d56Sopenharmony_ci      True
11737db96d56Sopenharmony_ci
11747db96d56Sopenharmony_ci   .. versionadded:: 3.5
11757db96d56Sopenharmony_ci
11767db96d56Sopenharmony_ci
11777db96d56Sopenharmony_ci.. method:: Path.symlink_to(target, target_is_directory=False)
11787db96d56Sopenharmony_ci
11797db96d56Sopenharmony_ci   Make this path a symbolic link to *target*.  Under Windows,
11807db96d56Sopenharmony_ci   *target_is_directory* must be true (default ``False``) if the link's target
11817db96d56Sopenharmony_ci   is a directory.  Under POSIX, *target_is_directory*'s value is ignored.
11827db96d56Sopenharmony_ci
11837db96d56Sopenharmony_ci   ::
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_ci      >>> p = Path('mylink')
11867db96d56Sopenharmony_ci      >>> p.symlink_to('setup.py')
11877db96d56Sopenharmony_ci      >>> p.resolve()
11887db96d56Sopenharmony_ci      PosixPath('/home/antoine/pathlib/setup.py')
11897db96d56Sopenharmony_ci      >>> p.stat().st_size
11907db96d56Sopenharmony_ci      956
11917db96d56Sopenharmony_ci      >>> p.lstat().st_size
11927db96d56Sopenharmony_ci      8
11937db96d56Sopenharmony_ci
11947db96d56Sopenharmony_ci   .. note::
11957db96d56Sopenharmony_ci      The order of arguments (link, target) is the reverse
11967db96d56Sopenharmony_ci      of :func:`os.symlink`'s.
11977db96d56Sopenharmony_ci
11987db96d56Sopenharmony_ci.. method:: Path.hardlink_to(target)
11997db96d56Sopenharmony_ci
12007db96d56Sopenharmony_ci   Make this path a hard link to the same file as *target*.
12017db96d56Sopenharmony_ci
12027db96d56Sopenharmony_ci   .. note::
12037db96d56Sopenharmony_ci      The order of arguments (link, target) is the reverse
12047db96d56Sopenharmony_ci      of :func:`os.link`'s.
12057db96d56Sopenharmony_ci
12067db96d56Sopenharmony_ci   .. versionadded:: 3.10
12077db96d56Sopenharmony_ci
12087db96d56Sopenharmony_ci.. method:: Path.link_to(target)
12097db96d56Sopenharmony_ci
12107db96d56Sopenharmony_ci   Make *target* a hard link to this path.
12117db96d56Sopenharmony_ci
12127db96d56Sopenharmony_ci   .. warning::
12137db96d56Sopenharmony_ci
12147db96d56Sopenharmony_ci      This function does not make this path a hard link to *target*, despite
12157db96d56Sopenharmony_ci      the implication of the function and argument names. The argument order
12167db96d56Sopenharmony_ci      (target, link) is the reverse of :func:`Path.symlink_to` and
12177db96d56Sopenharmony_ci      :func:`Path.hardlink_to`, but matches that of :func:`os.link`.
12187db96d56Sopenharmony_ci
12197db96d56Sopenharmony_ci   .. versionadded:: 3.8
12207db96d56Sopenharmony_ci
12217db96d56Sopenharmony_ci   .. deprecated:: 3.10
12227db96d56Sopenharmony_ci
12237db96d56Sopenharmony_ci      This method is deprecated in favor of :meth:`Path.hardlink_to`, as the
12247db96d56Sopenharmony_ci      argument order of :meth:`Path.link_to`  does not match that of
12257db96d56Sopenharmony_ci      :meth:`Path.symlink_to`.
12267db96d56Sopenharmony_ci
12277db96d56Sopenharmony_ci
12287db96d56Sopenharmony_ci.. method:: Path.touch(mode=0o666, exist_ok=True)
12297db96d56Sopenharmony_ci
12307db96d56Sopenharmony_ci   Create a file at this given path.  If *mode* is given, it is combined
12317db96d56Sopenharmony_ci   with the process' ``umask`` value to determine the file mode and access
12327db96d56Sopenharmony_ci   flags.  If the file already exists, the function succeeds if *exist_ok*
12337db96d56Sopenharmony_ci   is true (and its modification time is updated to the current time),
12347db96d56Sopenharmony_ci   otherwise :exc:`FileExistsError` is raised.
12357db96d56Sopenharmony_ci
12367db96d56Sopenharmony_ci
12377db96d56Sopenharmony_ci.. method:: Path.unlink(missing_ok=False)
12387db96d56Sopenharmony_ci
12397db96d56Sopenharmony_ci   Remove this file or symbolic link.  If the path points to a directory,
12407db96d56Sopenharmony_ci   use :func:`Path.rmdir` instead.
12417db96d56Sopenharmony_ci
12427db96d56Sopenharmony_ci   If *missing_ok* is false (the default), :exc:`FileNotFoundError` is
12437db96d56Sopenharmony_ci   raised if the path does not exist.
12447db96d56Sopenharmony_ci
12457db96d56Sopenharmony_ci   If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be
12467db96d56Sopenharmony_ci   ignored (same behavior as the POSIX ``rm -f`` command).
12477db96d56Sopenharmony_ci
12487db96d56Sopenharmony_ci   .. versionchanged:: 3.8
12497db96d56Sopenharmony_ci      The *missing_ok* parameter was added.
12507db96d56Sopenharmony_ci
12517db96d56Sopenharmony_ci
12527db96d56Sopenharmony_ci.. method:: Path.write_bytes(data)
12537db96d56Sopenharmony_ci
12547db96d56Sopenharmony_ci   Open the file pointed to in bytes mode, write *data* to it, and close the
12557db96d56Sopenharmony_ci   file::
12567db96d56Sopenharmony_ci
12577db96d56Sopenharmony_ci      >>> p = Path('my_binary_file')
12587db96d56Sopenharmony_ci      >>> p.write_bytes(b'Binary file contents')
12597db96d56Sopenharmony_ci      20
12607db96d56Sopenharmony_ci      >>> p.read_bytes()
12617db96d56Sopenharmony_ci      b'Binary file contents'
12627db96d56Sopenharmony_ci
12637db96d56Sopenharmony_ci   An existing file of the same name is overwritten.
12647db96d56Sopenharmony_ci
12657db96d56Sopenharmony_ci   .. versionadded:: 3.5
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_ci
12687db96d56Sopenharmony_ci.. method:: Path.write_text(data, encoding=None, errors=None, newline=None)
12697db96d56Sopenharmony_ci
12707db96d56Sopenharmony_ci   Open the file pointed to in text mode, write *data* to it, and close the
12717db96d56Sopenharmony_ci   file::
12727db96d56Sopenharmony_ci
12737db96d56Sopenharmony_ci      >>> p = Path('my_text_file')
12747db96d56Sopenharmony_ci      >>> p.write_text('Text file contents')
12757db96d56Sopenharmony_ci      18
12767db96d56Sopenharmony_ci      >>> p.read_text()
12777db96d56Sopenharmony_ci      'Text file contents'
12787db96d56Sopenharmony_ci
12797db96d56Sopenharmony_ci   An existing file of the same name is overwritten. The optional parameters
12807db96d56Sopenharmony_ci   have the same meaning as in :func:`open`.
12817db96d56Sopenharmony_ci
12827db96d56Sopenharmony_ci   .. versionadded:: 3.5
12837db96d56Sopenharmony_ci
12847db96d56Sopenharmony_ci   .. versionchanged:: 3.10
12857db96d56Sopenharmony_ci      The *newline* parameter was added.
12867db96d56Sopenharmony_ci
12877db96d56Sopenharmony_ciCorrespondence to tools in the :mod:`os` module
12887db96d56Sopenharmony_ci-----------------------------------------------
12897db96d56Sopenharmony_ci
12907db96d56Sopenharmony_ciBelow is a table mapping various :mod:`os` functions to their corresponding
12917db96d56Sopenharmony_ci:class:`PurePath`/:class:`Path` equivalent.
12927db96d56Sopenharmony_ci
12937db96d56Sopenharmony_ci.. note::
12947db96d56Sopenharmony_ci
12957db96d56Sopenharmony_ci   Not all pairs of functions/methods below are equivalent. Some of them,
12967db96d56Sopenharmony_ci   despite having some overlapping use-cases, have different semantics. They
12977db96d56Sopenharmony_ci   include :func:`os.path.abspath` and :meth:`Path.absolute`,
12987db96d56Sopenharmony_ci   :func:`os.path.relpath` and :meth:`PurePath.relative_to`.
12997db96d56Sopenharmony_ci
13007db96d56Sopenharmony_ci====================================   ==============================
13017db96d56Sopenharmony_ci:mod:`os` and :mod:`os.path`           :mod:`pathlib`
13027db96d56Sopenharmony_ci====================================   ==============================
13037db96d56Sopenharmony_ci:func:`os.path.abspath`                :meth:`Path.absolute` [#]_
13047db96d56Sopenharmony_ci:func:`os.path.realpath`               :meth:`Path.resolve`
13057db96d56Sopenharmony_ci:func:`os.chmod`                       :meth:`Path.chmod`
13067db96d56Sopenharmony_ci:func:`os.mkdir`                       :meth:`Path.mkdir`
13077db96d56Sopenharmony_ci:func:`os.makedirs`                    :meth:`Path.mkdir`
13087db96d56Sopenharmony_ci:func:`os.rename`                      :meth:`Path.rename`
13097db96d56Sopenharmony_ci:func:`os.replace`                     :meth:`Path.replace`
13107db96d56Sopenharmony_ci:func:`os.rmdir`                       :meth:`Path.rmdir`
13117db96d56Sopenharmony_ci:func:`os.remove`, :func:`os.unlink`   :meth:`Path.unlink`
13127db96d56Sopenharmony_ci:func:`os.getcwd`                      :func:`Path.cwd`
13137db96d56Sopenharmony_ci:func:`os.path.exists`                 :meth:`Path.exists`
13147db96d56Sopenharmony_ci:func:`os.path.expanduser`             :meth:`Path.expanduser` and
13157db96d56Sopenharmony_ci                                       :meth:`Path.home`
13167db96d56Sopenharmony_ci:func:`os.listdir`                     :meth:`Path.iterdir`
13177db96d56Sopenharmony_ci:func:`os.path.isdir`                  :meth:`Path.is_dir`
13187db96d56Sopenharmony_ci:func:`os.path.isfile`                 :meth:`Path.is_file`
13197db96d56Sopenharmony_ci:func:`os.path.islink`                 :meth:`Path.is_symlink`
13207db96d56Sopenharmony_ci:func:`os.link`                        :meth:`Path.hardlink_to`
13217db96d56Sopenharmony_ci:func:`os.symlink`                     :meth:`Path.symlink_to`
13227db96d56Sopenharmony_ci:func:`os.readlink`                    :meth:`Path.readlink`
13237db96d56Sopenharmony_ci:func:`os.path.relpath`                :meth:`PurePath.relative_to` [#]_
13247db96d56Sopenharmony_ci:func:`os.stat`                        :meth:`Path.stat`,
13257db96d56Sopenharmony_ci                                       :meth:`Path.owner`,
13267db96d56Sopenharmony_ci                                       :meth:`Path.group`
13277db96d56Sopenharmony_ci:func:`os.path.isabs`                  :meth:`PurePath.is_absolute`
13287db96d56Sopenharmony_ci:func:`os.path.join`                   :func:`PurePath.joinpath`
13297db96d56Sopenharmony_ci:func:`os.path.basename`               :attr:`PurePath.name`
13307db96d56Sopenharmony_ci:func:`os.path.dirname`                :attr:`PurePath.parent`
13317db96d56Sopenharmony_ci:func:`os.path.samefile`               :meth:`Path.samefile`
13327db96d56Sopenharmony_ci:func:`os.path.splitext`               :attr:`PurePath.stem` and
13337db96d56Sopenharmony_ci                                       :attr:`PurePath.suffix`
13347db96d56Sopenharmony_ci====================================   ==============================
13357db96d56Sopenharmony_ci
13367db96d56Sopenharmony_ci.. rubric:: Footnotes
13377db96d56Sopenharmony_ci
13387db96d56Sopenharmony_ci.. [#] :func:`os.path.abspath` normalizes the resulting path, which may change its meaning in the presence of symlinks, while :meth:`Path.absolute` does not.
13397db96d56Sopenharmony_ci.. [#] :meth:`PurePath.relative_to` requires ``self`` to be the subpath of the argument, but :func:`os.path.relpath` does not.
1340