1 2:mod:`pathlib` --- Object-oriented filesystem paths 3=================================================== 4 5.. module:: pathlib 6 :synopsis: Object-oriented filesystem paths 7 8.. versionadded:: 3.4 9 10**Source code:** :source:`Lib/pathlib.py` 11 12.. index:: single: path; operations 13 14-------------- 15 16This module offers classes representing filesystem paths with semantics 17appropriate for different operating systems. Path classes are divided 18between :ref:`pure paths <pure-paths>`, which provide purely computational 19operations without I/O, and :ref:`concrete paths <concrete-paths>`, which 20inherit from pure paths but also provide I/O operations. 21 22.. image:: pathlib-inheritance.png 23 :align: center 24 25If you've never used this module before or just aren't sure which class is 26right for your task, :class:`Path` is most likely what you need. It instantiates 27a :ref:`concrete path <concrete-paths>` for the platform the code is running on. 28 29Pure paths are useful in some special cases; for example: 30 31#. If you want to manipulate Windows paths on a Unix machine (or vice versa). 32 You cannot instantiate a :class:`WindowsPath` when running on Unix, but you 33 can instantiate :class:`PureWindowsPath`. 34#. You want to make sure that your code only manipulates paths without actually 35 accessing the OS. In this case, instantiating one of the pure classes may be 36 useful since those simply don't have any OS-accessing operations. 37 38.. seealso:: 39 :pep:`428`: The pathlib module -- object-oriented filesystem paths. 40 41.. seealso:: 42 For low-level path manipulation on strings, you can also use the 43 :mod:`os.path` module. 44 45 46Basic use 47--------- 48 49Importing the main class:: 50 51 >>> from pathlib import Path 52 53Listing subdirectories:: 54 55 >>> p = Path('.') 56 >>> [x for x in p.iterdir() if x.is_dir()] 57 [PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'), 58 PosixPath('__pycache__'), PosixPath('build')] 59 60Listing Python source files in this directory tree:: 61 62 >>> list(p.glob('**/*.py')) 63 [PosixPath('test_pathlib.py'), PosixPath('setup.py'), 64 PosixPath('pathlib.py'), PosixPath('docs/conf.py'), 65 PosixPath('build/lib/pathlib.py')] 66 67Navigating inside a directory tree:: 68 69 >>> p = Path('/etc') 70 >>> q = p / 'init.d' / 'reboot' 71 >>> q 72 PosixPath('/etc/init.d/reboot') 73 >>> q.resolve() 74 PosixPath('/etc/rc.d/init.d/halt') 75 76Querying path properties:: 77 78 >>> q.exists() 79 True 80 >>> q.is_dir() 81 False 82 83Opening a file:: 84 85 >>> with q.open() as f: f.readline() 86 ... 87 '#!/bin/bash\n' 88 89 90.. _pure-paths: 91 92Pure paths 93---------- 94 95Pure path objects provide path-handling operations which don't actually 96access a filesystem. There are three ways to access these classes, which 97we also call *flavours*: 98 99.. class:: PurePath(*pathsegments) 100 101 A generic class that represents the system's path flavour (instantiating 102 it creates either a :class:`PurePosixPath` or a :class:`PureWindowsPath`):: 103 104 >>> PurePath('setup.py') # Running on a Unix machine 105 PurePosixPath('setup.py') 106 107 Each element of *pathsegments* can be either a string representing a 108 path segment, an object implementing the :class:`os.PathLike` interface 109 which returns a string, or another path object:: 110 111 >>> PurePath('foo', 'some/path', 'bar') 112 PurePosixPath('foo/some/path/bar') 113 >>> PurePath(Path('foo'), Path('bar')) 114 PurePosixPath('foo/bar') 115 116 When *pathsegments* is empty, the current directory is assumed:: 117 118 >>> PurePath() 119 PurePosixPath('.') 120 121 When several absolute paths are given, the last is taken as an anchor 122 (mimicking :func:`os.path.join`'s behaviour):: 123 124 >>> PurePath('/etc', '/usr', 'lib64') 125 PurePosixPath('/usr/lib64') 126 >>> PureWindowsPath('c:/Windows', 'd:bar') 127 PureWindowsPath('d:bar') 128 129 However, in a Windows path, changing the local root doesn't discard the 130 previous drive setting:: 131 132 >>> PureWindowsPath('c:/Windows', '/Program Files') 133 PureWindowsPath('c:/Program Files') 134 135 Spurious slashes and single dots are collapsed, but double dots (``'..'``) 136 are not, since this would change the meaning of a path in the face of 137 symbolic links:: 138 139 >>> PurePath('foo//bar') 140 PurePosixPath('foo/bar') 141 >>> PurePath('foo/./bar') 142 PurePosixPath('foo/bar') 143 >>> PurePath('foo/../bar') 144 PurePosixPath('foo/../bar') 145 146 (a naïve approach would make ``PurePosixPath('foo/../bar')`` equivalent 147 to ``PurePosixPath('bar')``, which is wrong if ``foo`` is a symbolic link 148 to another directory) 149 150 Pure path objects implement the :class:`os.PathLike` interface, allowing them 151 to be used anywhere the interface is accepted. 152 153 .. versionchanged:: 3.6 154 Added support for the :class:`os.PathLike` interface. 155 156.. class:: PurePosixPath(*pathsegments) 157 158 A subclass of :class:`PurePath`, this path flavour represents non-Windows 159 filesystem paths:: 160 161 >>> PurePosixPath('/etc') 162 PurePosixPath('/etc') 163 164 *pathsegments* is specified similarly to :class:`PurePath`. 165 166.. class:: PureWindowsPath(*pathsegments) 167 168 A subclass of :class:`PurePath`, this path flavour represents Windows 169 filesystem paths:: 170 171 >>> PureWindowsPath('c:/Program Files/') 172 PureWindowsPath('c:/Program Files') 173 174 *pathsegments* is specified similarly to :class:`PurePath`. 175 176Regardless of the system you're running on, you can instantiate all of 177these classes, since they don't provide any operation that does system calls. 178 179 180General properties 181^^^^^^^^^^^^^^^^^^ 182 183Paths are immutable and hashable. Paths of a same flavour are comparable 184and orderable. These properties respect the flavour's case-folding 185semantics:: 186 187 >>> PurePosixPath('foo') == PurePosixPath('FOO') 188 False 189 >>> PureWindowsPath('foo') == PureWindowsPath('FOO') 190 True 191 >>> PureWindowsPath('FOO') in { PureWindowsPath('foo') } 192 True 193 >>> PureWindowsPath('C:') < PureWindowsPath('d:') 194 True 195 196Paths of a different flavour compare unequal and cannot be ordered:: 197 198 >>> PureWindowsPath('foo') == PurePosixPath('foo') 199 False 200 >>> PureWindowsPath('foo') < PurePosixPath('foo') 201 Traceback (most recent call last): 202 File "<stdin>", line 1, in <module> 203 TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath' 204 205 206Operators 207^^^^^^^^^ 208 209The slash operator helps create child paths, similarly to :func:`os.path.join`:: 210 211 >>> p = PurePath('/etc') 212 >>> p 213 PurePosixPath('/etc') 214 >>> p / 'init.d' / 'apache2' 215 PurePosixPath('/etc/init.d/apache2') 216 >>> q = PurePath('bin') 217 >>> '/usr' / q 218 PurePosixPath('/usr/bin') 219 220A path object can be used anywhere an object implementing :class:`os.PathLike` 221is accepted:: 222 223 >>> import os 224 >>> p = PurePath('/etc') 225 >>> os.fspath(p) 226 '/etc' 227 228The string representation of a path is the raw filesystem path itself 229(in native form, e.g. with backslashes under Windows), which you can 230pass to any function taking a file path as a string:: 231 232 >>> p = PurePath('/etc') 233 >>> str(p) 234 '/etc' 235 >>> p = PureWindowsPath('c:/Program Files') 236 >>> str(p) 237 'c:\\Program Files' 238 239Similarly, calling :class:`bytes` on a path gives the raw filesystem path as a 240bytes object, as encoded by :func:`os.fsencode`:: 241 242 >>> bytes(p) 243 b'/etc' 244 245.. note:: 246 Calling :class:`bytes` is only recommended under Unix. Under Windows, 247 the unicode form is the canonical representation of filesystem paths. 248 249 250Accessing individual parts 251^^^^^^^^^^^^^^^^^^^^^^^^^^ 252 253To access the individual "parts" (components) of a path, use the following 254property: 255 256.. data:: PurePath.parts 257 258 A tuple giving access to the path's various components:: 259 260 >>> p = PurePath('/usr/bin/python3') 261 >>> p.parts 262 ('/', 'usr', 'bin', 'python3') 263 264 >>> p = PureWindowsPath('c:/Program Files/PSF') 265 >>> p.parts 266 ('c:\\', 'Program Files', 'PSF') 267 268 (note how the drive and local root are regrouped in a single part) 269 270 271Methods and properties 272^^^^^^^^^^^^^^^^^^^^^^ 273 274.. testsetup:: 275 276 from pathlib import PurePath, PurePosixPath, PureWindowsPath 277 278Pure paths provide the following methods and properties: 279 280.. data:: PurePath.drive 281 282 A string representing the drive letter or name, if any:: 283 284 >>> PureWindowsPath('c:/Program Files/').drive 285 'c:' 286 >>> PureWindowsPath('/Program Files/').drive 287 '' 288 >>> PurePosixPath('/etc').drive 289 '' 290 291 UNC shares are also considered drives:: 292 293 >>> PureWindowsPath('//host/share/foo.txt').drive 294 '\\\\host\\share' 295 296.. data:: PurePath.root 297 298 A string representing the (local or global) root, if any:: 299 300 >>> PureWindowsPath('c:/Program Files/').root 301 '\\' 302 >>> PureWindowsPath('c:Program Files/').root 303 '' 304 >>> PurePosixPath('/etc').root 305 '/' 306 307 UNC shares always have a root:: 308 309 >>> PureWindowsPath('//host/share').root 310 '\\' 311 312.. data:: PurePath.anchor 313 314 The concatenation of the drive and root:: 315 316 >>> PureWindowsPath('c:/Program Files/').anchor 317 'c:\\' 318 >>> PureWindowsPath('c:Program Files/').anchor 319 'c:' 320 >>> PurePosixPath('/etc').anchor 321 '/' 322 >>> PureWindowsPath('//host/share').anchor 323 '\\\\host\\share\\' 324 325 326.. data:: PurePath.parents 327 328 An immutable sequence providing access to the logical ancestors of 329 the path:: 330 331 >>> p = PureWindowsPath('c:/foo/bar/setup.py') 332 >>> p.parents[0] 333 PureWindowsPath('c:/foo/bar') 334 >>> p.parents[1] 335 PureWindowsPath('c:/foo') 336 >>> p.parents[2] 337 PureWindowsPath('c:/') 338 339 .. versionchanged:: 3.10 340 The parents sequence now supports :term:`slices <slice>` and negative index values. 341 342.. data:: PurePath.parent 343 344 The logical parent of the path:: 345 346 >>> p = PurePosixPath('/a/b/c/d') 347 >>> p.parent 348 PurePosixPath('/a/b/c') 349 350 You cannot go past an anchor, or empty path:: 351 352 >>> p = PurePosixPath('/') 353 >>> p.parent 354 PurePosixPath('/') 355 >>> p = PurePosixPath('.') 356 >>> p.parent 357 PurePosixPath('.') 358 359 .. note:: 360 This is a purely lexical operation, hence the following behaviour:: 361 362 >>> p = PurePosixPath('foo/..') 363 >>> p.parent 364 PurePosixPath('foo') 365 366 If you want to walk an arbitrary filesystem path upwards, it is 367 recommended to first call :meth:`Path.resolve` so as to resolve 368 symlinks and eliminate `".."` components. 369 370 371.. data:: PurePath.name 372 373 A string representing the final path component, excluding the drive and 374 root, if any:: 375 376 >>> PurePosixPath('my/library/setup.py').name 377 'setup.py' 378 379 UNC drive names are not considered:: 380 381 >>> PureWindowsPath('//some/share/setup.py').name 382 'setup.py' 383 >>> PureWindowsPath('//some/share').name 384 '' 385 386 387.. data:: PurePath.suffix 388 389 The file extension of the final component, if any:: 390 391 >>> PurePosixPath('my/library/setup.py').suffix 392 '.py' 393 >>> PurePosixPath('my/library.tar.gz').suffix 394 '.gz' 395 >>> PurePosixPath('my/library').suffix 396 '' 397 398 399.. data:: PurePath.suffixes 400 401 A list of the path's file extensions:: 402 403 >>> PurePosixPath('my/library.tar.gar').suffixes 404 ['.tar', '.gar'] 405 >>> PurePosixPath('my/library.tar.gz').suffixes 406 ['.tar', '.gz'] 407 >>> PurePosixPath('my/library').suffixes 408 [] 409 410 411.. data:: PurePath.stem 412 413 The final path component, without its suffix:: 414 415 >>> PurePosixPath('my/library.tar.gz').stem 416 'library.tar' 417 >>> PurePosixPath('my/library.tar').stem 418 'library' 419 >>> PurePosixPath('my/library').stem 420 'library' 421 422 423.. method:: PurePath.as_posix() 424 425 Return a string representation of the path with forward slashes (``/``):: 426 427 >>> p = PureWindowsPath('c:\\windows') 428 >>> str(p) 429 'c:\\windows' 430 >>> p.as_posix() 431 'c:/windows' 432 433 434.. method:: PurePath.as_uri() 435 436 Represent the path as a ``file`` URI. :exc:`ValueError` is raised if 437 the path isn't absolute. 438 439 >>> p = PurePosixPath('/etc/passwd') 440 >>> p.as_uri() 441 'file:///etc/passwd' 442 >>> p = PureWindowsPath('c:/Windows') 443 >>> p.as_uri() 444 'file:///c:/Windows' 445 446 447.. method:: PurePath.is_absolute() 448 449 Return whether the path is absolute or not. A path is considered absolute 450 if it has both a root and (if the flavour allows) a drive:: 451 452 >>> PurePosixPath('/a/b').is_absolute() 453 True 454 >>> PurePosixPath('a/b').is_absolute() 455 False 456 457 >>> PureWindowsPath('c:/a/b').is_absolute() 458 True 459 >>> PureWindowsPath('/a/b').is_absolute() 460 False 461 >>> PureWindowsPath('c:').is_absolute() 462 False 463 >>> PureWindowsPath('//some/share').is_absolute() 464 True 465 466 467.. method:: PurePath.is_relative_to(*other) 468 469 Return whether or not this path is relative to the *other* path. 470 471 >>> p = PurePath('/etc/passwd') 472 >>> p.is_relative_to('/etc') 473 True 474 >>> p.is_relative_to('/usr') 475 False 476 477 .. versionadded:: 3.9 478 479 480.. method:: PurePath.is_reserved() 481 482 With :class:`PureWindowsPath`, return ``True`` if the path is considered 483 reserved under Windows, ``False`` otherwise. With :class:`PurePosixPath`, 484 ``False`` is always returned. 485 486 >>> PureWindowsPath('nul').is_reserved() 487 True 488 >>> PurePosixPath('nul').is_reserved() 489 False 490 491 File system calls on reserved paths can fail mysteriously or have 492 unintended effects. 493 494 495.. method:: PurePath.joinpath(*other) 496 497 Calling this method is equivalent to combining the path with each of 498 the *other* arguments in turn:: 499 500 >>> PurePosixPath('/etc').joinpath('passwd') 501 PurePosixPath('/etc/passwd') 502 >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd')) 503 PurePosixPath('/etc/passwd') 504 >>> PurePosixPath('/etc').joinpath('init.d', 'apache2') 505 PurePosixPath('/etc/init.d/apache2') 506 >>> PureWindowsPath('c:').joinpath('/Program Files') 507 PureWindowsPath('c:/Program Files') 508 509 510.. method:: PurePath.match(pattern) 511 512 Match this path against the provided glob-style pattern. Return ``True`` 513 if matching is successful, ``False`` otherwise. 514 515 If *pattern* is relative, the path can be either relative or absolute, 516 and matching is done from the right:: 517 518 >>> PurePath('a/b.py').match('*.py') 519 True 520 >>> PurePath('/a/b/c.py').match('b/*.py') 521 True 522 >>> PurePath('/a/b/c.py').match('a/*.py') 523 False 524 525 If *pattern* is absolute, the path must be absolute, and the whole path 526 must match:: 527 528 >>> PurePath('/a.py').match('/*.py') 529 True 530 >>> PurePath('a/b.py').match('/*.py') 531 False 532 533 As with other methods, case-sensitivity follows platform defaults:: 534 535 >>> PurePosixPath('b.py').match('*.PY') 536 False 537 >>> PureWindowsPath('b.py').match('*.PY') 538 True 539 540 541.. method:: PurePath.relative_to(*other) 542 543 Compute a version of this path relative to the path represented by 544 *other*. If it's impossible, ValueError is raised:: 545 546 >>> p = PurePosixPath('/etc/passwd') 547 >>> p.relative_to('/') 548 PurePosixPath('etc/passwd') 549 >>> p.relative_to('/etc') 550 PurePosixPath('passwd') 551 >>> p.relative_to('/usr') 552 Traceback (most recent call last): 553 File "<stdin>", line 1, in <module> 554 File "pathlib.py", line 694, in relative_to 555 .format(str(self), str(formatted))) 556 ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other absolute. 557 558 NOTE: This function is part of :class:`PurePath` and works with strings. It does not check or access the underlying file structure. 559 560 561.. method:: PurePath.with_name(name) 562 563 Return a new path with the :attr:`name` changed. If the original path 564 doesn't have a name, ValueError is raised:: 565 566 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') 567 >>> p.with_name('setup.py') 568 PureWindowsPath('c:/Downloads/setup.py') 569 >>> p = PureWindowsPath('c:/') 570 >>> p.with_name('setup.py') 571 Traceback (most recent call last): 572 File "<stdin>", line 1, in <module> 573 File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name 574 raise ValueError("%r has an empty name" % (self,)) 575 ValueError: PureWindowsPath('c:/') has an empty name 576 577 578.. method:: PurePath.with_stem(stem) 579 580 Return a new path with the :attr:`stem` changed. If the original path 581 doesn't have a name, ValueError is raised:: 582 583 >>> p = PureWindowsPath('c:/Downloads/draft.txt') 584 >>> p.with_stem('final') 585 PureWindowsPath('c:/Downloads/final.txt') 586 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') 587 >>> p.with_stem('lib') 588 PureWindowsPath('c:/Downloads/lib.gz') 589 >>> p = PureWindowsPath('c:/') 590 >>> p.with_stem('') 591 Traceback (most recent call last): 592 File "<stdin>", line 1, in <module> 593 File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem 594 return self.with_name(stem + self.suffix) 595 File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name 596 raise ValueError("%r has an empty name" % (self,)) 597 ValueError: PureWindowsPath('c:/') has an empty name 598 599 .. versionadded:: 3.9 600 601 602.. method:: PurePath.with_suffix(suffix) 603 604 Return a new path with the :attr:`suffix` changed. If the original path 605 doesn't have a suffix, the new *suffix* is appended instead. If the 606 *suffix* is an empty string, the original suffix is removed:: 607 608 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz') 609 >>> p.with_suffix('.bz2') 610 PureWindowsPath('c:/Downloads/pathlib.tar.bz2') 611 >>> p = PureWindowsPath('README') 612 >>> p.with_suffix('.txt') 613 PureWindowsPath('README.txt') 614 >>> p = PureWindowsPath('README.txt') 615 >>> p.with_suffix('') 616 PureWindowsPath('README') 617 618 619.. _concrete-paths: 620 621 622Concrete paths 623-------------- 624 625Concrete paths are subclasses of the pure path classes. In addition to 626operations provided by the latter, they also provide methods to do system 627calls on path objects. There are three ways to instantiate concrete paths: 628 629.. class:: Path(*pathsegments) 630 631 A subclass of :class:`PurePath`, this class represents concrete paths of 632 the system's path flavour (instantiating it creates either a 633 :class:`PosixPath` or a :class:`WindowsPath`):: 634 635 >>> Path('setup.py') 636 PosixPath('setup.py') 637 638 *pathsegments* is specified similarly to :class:`PurePath`. 639 640.. class:: PosixPath(*pathsegments) 641 642 A subclass of :class:`Path` and :class:`PurePosixPath`, this class 643 represents concrete non-Windows filesystem paths:: 644 645 >>> PosixPath('/etc') 646 PosixPath('/etc') 647 648 *pathsegments* is specified similarly to :class:`PurePath`. 649 650.. class:: WindowsPath(*pathsegments) 651 652 A subclass of :class:`Path` and :class:`PureWindowsPath`, this class 653 represents concrete Windows filesystem paths:: 654 655 >>> WindowsPath('c:/Program Files/') 656 WindowsPath('c:/Program Files') 657 658 *pathsegments* is specified similarly to :class:`PurePath`. 659 660You can only instantiate the class flavour that corresponds to your system 661(allowing system calls on non-compatible path flavours could lead to 662bugs or failures in your application):: 663 664 >>> import os 665 >>> os.name 666 'posix' 667 >>> Path('setup.py') 668 PosixPath('setup.py') 669 >>> PosixPath('setup.py') 670 PosixPath('setup.py') 671 >>> WindowsPath('setup.py') 672 Traceback (most recent call last): 673 File "<stdin>", line 1, in <module> 674 File "pathlib.py", line 798, in __new__ 675 % (cls.__name__,)) 676 NotImplementedError: cannot instantiate 'WindowsPath' on your system 677 678 679Methods 680^^^^^^^ 681 682Concrete paths provide the following methods in addition to pure paths 683methods. Many of these methods can raise an :exc:`OSError` if a system 684call fails (for example because the path doesn't exist). 685 686.. versionchanged:: 3.8 687 688 :meth:`~Path.exists()`, :meth:`~Path.is_dir()`, :meth:`~Path.is_file()`, 689 :meth:`~Path.is_mount()`, :meth:`~Path.is_symlink()`, 690 :meth:`~Path.is_block_device()`, :meth:`~Path.is_char_device()`, 691 :meth:`~Path.is_fifo()`, :meth:`~Path.is_socket()` now return ``False`` 692 instead of raising an exception for paths that contain characters 693 unrepresentable at the OS level. 694 695 696.. classmethod:: Path.cwd() 697 698 Return a new path object representing the current directory (as returned 699 by :func:`os.getcwd`):: 700 701 >>> Path.cwd() 702 PosixPath('/home/antoine/pathlib') 703 704 705.. classmethod:: Path.home() 706 707 Return a new path object representing the user's home directory (as 708 returned by :func:`os.path.expanduser` with ``~`` construct). If the home 709 directory can't be resolved, :exc:`RuntimeError` is raised. 710 711 :: 712 713 >>> Path.home() 714 PosixPath('/home/antoine') 715 716 .. versionadded:: 3.5 717 718 719.. method:: Path.stat(*, follow_symlinks=True) 720 721 Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`. 722 The result is looked up at each call to this method. 723 724 This method normally follows symlinks; to stat a symlink add the argument 725 ``follow_symlinks=False``, or use :meth:`~Path.lstat`. 726 727 :: 728 729 >>> p = Path('setup.py') 730 >>> p.stat().st_size 731 956 732 >>> p.stat().st_mtime 733 1327883547.852554 734 735 .. versionchanged:: 3.10 736 The *follow_symlinks* parameter was added. 737 738.. method:: Path.chmod(mode, *, follow_symlinks=True) 739 740 Change the file mode and permissions, like :func:`os.chmod`. 741 742 This method normally follows symlinks. Some Unix flavours support changing 743 permissions on the symlink itself; on these platforms you may add the 744 argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`. 745 746 :: 747 748 >>> p = Path('setup.py') 749 >>> p.stat().st_mode 750 33277 751 >>> p.chmod(0o444) 752 >>> p.stat().st_mode 753 33060 754 755 .. versionchanged:: 3.10 756 The *follow_symlinks* parameter was added. 757 758.. method:: Path.exists() 759 760 Whether the path points to an existing file or directory:: 761 762 >>> Path('.').exists() 763 True 764 >>> Path('setup.py').exists() 765 True 766 >>> Path('/etc').exists() 767 True 768 >>> Path('nonexistentfile').exists() 769 False 770 771 .. note:: 772 If the path points to a symlink, :meth:`exists` returns whether the 773 symlink *points to* an existing file or directory. 774 775 776.. method:: Path.expanduser() 777 778 Return a new path with expanded ``~`` and ``~user`` constructs, 779 as returned by :meth:`os.path.expanduser`. If a home directory can't be 780 resolved, :exc:`RuntimeError` is raised. 781 782 :: 783 784 >>> p = PosixPath('~/films/Monty Python') 785 >>> p.expanduser() 786 PosixPath('/home/eric/films/Monty Python') 787 788 .. versionadded:: 3.5 789 790 791.. method:: Path.glob(pattern) 792 793 Glob the given relative *pattern* in the directory represented by this path, 794 yielding all matching files (of any kind):: 795 796 >>> sorted(Path('.').glob('*.py')) 797 [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')] 798 >>> sorted(Path('.').glob('*/*.py')) 799 [PosixPath('docs/conf.py')] 800 801 Patterns are the same as for :mod:`fnmatch`, with the addition of "``**``" 802 which means "this directory and all subdirectories, recursively". In other 803 words, it enables recursive globbing:: 804 805 >>> sorted(Path('.').glob('**/*.py')) 806 [PosixPath('build/lib/pathlib.py'), 807 PosixPath('docs/conf.py'), 808 PosixPath('pathlib.py'), 809 PosixPath('setup.py'), 810 PosixPath('test_pathlib.py')] 811 812 .. note:: 813 Using the "``**``" pattern in large directory trees may consume 814 an inordinate amount of time. 815 816 .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob 817 818 819.. method:: Path.group() 820 821 Return the name of the group owning the file. :exc:`KeyError` is raised 822 if the file's gid isn't found in the system database. 823 824 825.. method:: Path.is_dir() 826 827 Return ``True`` if the path points to a directory (or a symbolic link 828 pointing to a directory), ``False`` if it points to another kind of file. 829 830 ``False`` is also returned if the path doesn't exist or is a broken symlink; 831 other errors (such as permission errors) are propagated. 832 833 834.. method:: Path.is_file() 835 836 Return ``True`` if the path points to a regular file (or a symbolic link 837 pointing to a regular file), ``False`` if it points to another kind of file. 838 839 ``False`` is also returned if the path doesn't exist or is a broken symlink; 840 other errors (such as permission errors) are propagated. 841 842 843.. method:: Path.is_mount() 844 845 Return ``True`` if the path is a :dfn:`mount point`: a point in a 846 file system where a different file system has been mounted. On POSIX, the 847 function checks whether *path*'s parent, :file:`path/..`, is on a different 848 device than *path*, or whether :file:`path/..` and *path* point to the same 849 i-node on the same device --- this should detect mount points for all Unix 850 and POSIX variants. Not implemented on Windows. 851 852 .. versionadded:: 3.7 853 854 855.. method:: Path.is_symlink() 856 857 Return ``True`` if the path points to a symbolic link, ``False`` otherwise. 858 859 ``False`` is also returned if the path doesn't exist; other errors (such 860 as permission errors) are propagated. 861 862 863.. method:: Path.is_socket() 864 865 Return ``True`` if the path points to a Unix socket (or a symbolic link 866 pointing to a Unix socket), ``False`` if it points to another kind of file. 867 868 ``False`` is also returned if the path doesn't exist or is a broken symlink; 869 other errors (such as permission errors) are propagated. 870 871 872.. method:: Path.is_fifo() 873 874 Return ``True`` if the path points to a FIFO (or a symbolic link 875 pointing to a FIFO), ``False`` if it points to another kind of file. 876 877 ``False`` is also returned if the path doesn't exist or is a broken symlink; 878 other errors (such as permission errors) are propagated. 879 880 881.. method:: Path.is_block_device() 882 883 Return ``True`` if the path points to a block device (or a symbolic link 884 pointing to a block device), ``False`` if it points to another kind of file. 885 886 ``False`` is also returned if the path doesn't exist or is a broken symlink; 887 other errors (such as permission errors) are propagated. 888 889 890.. method:: Path.is_char_device() 891 892 Return ``True`` if the path points to a character device (or a symbolic link 893 pointing to a character device), ``False`` if it points to another kind of file. 894 895 ``False`` is also returned if the path doesn't exist or is a broken symlink; 896 other errors (such as permission errors) are propagated. 897 898 899.. method:: Path.iterdir() 900 901 When the path points to a directory, yield path objects of the directory 902 contents:: 903 904 >>> p = Path('docs') 905 >>> for child in p.iterdir(): child 906 ... 907 PosixPath('docs/conf.py') 908 PosixPath('docs/_templates') 909 PosixPath('docs/make.bat') 910 PosixPath('docs/index.rst') 911 PosixPath('docs/_build') 912 PosixPath('docs/_static') 913 PosixPath('docs/Makefile') 914 915 The children are yielded in arbitrary order, and the special entries 916 ``'.'`` and ``'..'`` are not included. If a file is removed from or added 917 to the directory after creating the iterator, whether an path object for 918 that file be included is unspecified. 919 920.. method:: Path.lchmod(mode) 921 922 Like :meth:`Path.chmod` but, if the path points to a symbolic link, the 923 symbolic link's mode is changed rather than its target's. 924 925 926.. method:: Path.lstat() 927 928 Like :meth:`Path.stat` but, if the path points to a symbolic link, return 929 the symbolic link's information rather than its target's. 930 931 932.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False) 933 934 Create a new directory at this given path. If *mode* is given, it is 935 combined with the process' ``umask`` value to determine the file mode 936 and access flags. If the path already exists, :exc:`FileExistsError` 937 is raised. 938 939 If *parents* is true, any missing parents of this path are created 940 as needed; they are created with the default permissions without taking 941 *mode* into account (mimicking the POSIX ``mkdir -p`` command). 942 943 If *parents* is false (the default), a missing parent raises 944 :exc:`FileNotFoundError`. 945 946 If *exist_ok* is false (the default), :exc:`FileExistsError` is 947 raised if the target directory already exists. 948 949 If *exist_ok* is true, :exc:`FileExistsError` exceptions will be 950 ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the 951 last path component is not an existing non-directory file. 952 953 .. versionchanged:: 3.5 954 The *exist_ok* parameter was added. 955 956 957.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None) 958 959 Open the file pointed to by the path, like the built-in :func:`open` 960 function does:: 961 962 >>> p = Path('setup.py') 963 >>> with p.open() as f: 964 ... f.readline() 965 ... 966 '#!/usr/bin/env python3\n' 967 968 969.. method:: Path.owner() 970 971 Return the name of the user owning the file. :exc:`KeyError` is raised 972 if the file's uid isn't found in the system database. 973 974 975.. method:: Path.read_bytes() 976 977 Return the binary contents of the pointed-to file as a bytes object:: 978 979 >>> p = Path('my_binary_file') 980 >>> p.write_bytes(b'Binary file contents') 981 20 982 >>> p.read_bytes() 983 b'Binary file contents' 984 985 .. versionadded:: 3.5 986 987 988.. method:: Path.read_text(encoding=None, errors=None) 989 990 Return the decoded contents of the pointed-to file as a string:: 991 992 >>> p = Path('my_text_file') 993 >>> p.write_text('Text file contents') 994 18 995 >>> p.read_text() 996 'Text file contents' 997 998 The file is opened and then closed. The optional parameters have the same 999 meaning as in :func:`open`. 1000 1001 .. versionadded:: 3.5 1002 1003 1004.. method:: Path.readlink() 1005 1006 Return the path to which the symbolic link points (as returned by 1007 :func:`os.readlink`):: 1008 1009 >>> p = Path('mylink') 1010 >>> p.symlink_to('setup.py') 1011 >>> p.readlink() 1012 PosixPath('setup.py') 1013 1014 .. versionadded:: 3.9 1015 1016 1017.. method:: Path.rename(target) 1018 1019 Rename this file or directory to the given *target*, and return a new Path 1020 instance pointing to *target*. On Unix, if *target* exists and is a file, 1021 it will be replaced silently if the user has permission. *target* can be 1022 either a string or another path object:: 1023 1024 >>> p = Path('foo') 1025 >>> p.open('w').write('some text') 1026 9 1027 >>> target = Path('bar') 1028 >>> p.rename(target) 1029 PosixPath('bar') 1030 >>> target.open().read() 1031 'some text' 1032 1033 The target path may be absolute or relative. Relative paths are interpreted 1034 relative to the current working directory, *not* the directory of the Path 1035 object. 1036 1037 .. versionchanged:: 3.8 1038 Added return value, return the new Path instance. 1039 1040 1041.. method:: Path.replace(target) 1042 1043 Rename this file or directory to the given *target*, and return a new Path 1044 instance pointing to *target*. If *target* points to an existing file or 1045 directory, it will be unconditionally replaced. 1046 1047 The target path may be absolute or relative. Relative paths are interpreted 1048 relative to the current working directory, *not* the directory of the Path 1049 object. 1050 1051 .. versionchanged:: 3.8 1052 Added return value, return the new Path instance. 1053 1054 1055.. method:: Path.resolve(strict=False) 1056 1057 Make the path absolute, resolving any symlinks. A new path object is 1058 returned:: 1059 1060 >>> p = Path() 1061 >>> p 1062 PosixPath('.') 1063 >>> p.resolve() 1064 PosixPath('/home/antoine/pathlib') 1065 1066 "``..``" components are also eliminated (this is the only method to do so):: 1067 1068 >>> p = Path('docs/../setup.py') 1069 >>> p.resolve() 1070 PosixPath('/home/antoine/pathlib/setup.py') 1071 1072 If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError` 1073 is raised. If *strict* is ``False``, the path is resolved as far as possible 1074 and any remainder is appended without checking whether it exists. If an 1075 infinite loop is encountered along the resolution path, :exc:`RuntimeError` 1076 is raised. 1077 1078 .. versionadded:: 3.6 1079 The *strict* argument (pre-3.6 behavior is strict). 1080 1081.. method:: Path.rglob(pattern) 1082 1083 This is like calling :func:`Path.glob` with "``**/``" added in front of the 1084 given relative *pattern*:: 1085 1086 >>> sorted(Path().rglob("*.py")) 1087 [PosixPath('build/lib/pathlib.py'), 1088 PosixPath('docs/conf.py'), 1089 PosixPath('pathlib.py'), 1090 PosixPath('setup.py'), 1091 PosixPath('test_pathlib.py')] 1092 1093 .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob 1094 1095 1096.. method:: Path.rmdir() 1097 1098 Remove this directory. The directory must be empty. 1099 1100 1101.. method:: Path.samefile(other_path) 1102 1103 Return whether this path points to the same file as *other_path*, which 1104 can be either a Path object, or a string. The semantics are similar 1105 to :func:`os.path.samefile` and :func:`os.path.samestat`. 1106 1107 An :exc:`OSError` can be raised if either file cannot be accessed for some 1108 reason. 1109 1110 :: 1111 1112 >>> p = Path('spam') 1113 >>> q = Path('eggs') 1114 >>> p.samefile(q) 1115 False 1116 >>> p.samefile('spam') 1117 True 1118 1119 .. versionadded:: 3.5 1120 1121 1122.. method:: Path.symlink_to(target, target_is_directory=False) 1123 1124 Make this path a symbolic link to *target*. Under Windows, 1125 *target_is_directory* must be true (default ``False``) if the link's target 1126 is a directory. Under POSIX, *target_is_directory*'s value is ignored. 1127 1128 :: 1129 1130 >>> p = Path('mylink') 1131 >>> p.symlink_to('setup.py') 1132 >>> p.resolve() 1133 PosixPath('/home/antoine/pathlib/setup.py') 1134 >>> p.stat().st_size 1135 956 1136 >>> p.lstat().st_size 1137 8 1138 1139 .. note:: 1140 The order of arguments (link, target) is the reverse 1141 of :func:`os.symlink`'s. 1142 1143.. method:: Path.hardlink_to(target) 1144 1145 Make this path a hard link to the same file as *target*. 1146 1147 .. note:: 1148 The order of arguments (link, target) is the reverse 1149 of :func:`os.link`'s. 1150 1151 .. versionadded:: 3.10 1152 1153.. method:: Path.link_to(target) 1154 1155 Make *target* a hard link to this path. 1156 1157 .. warning:: 1158 1159 This function does not make this path a hard link to *target*, despite 1160 the implication of the function and argument names. The argument order 1161 (target, link) is the reverse of :func:`Path.symlink_to` and 1162 :func:`Path.hardlink_to`, but matches that of :func:`os.link`. 1163 1164 .. versionadded:: 3.8 1165 1166 .. deprecated:: 3.10 1167 1168 This method is deprecated in favor of :meth:`Path.hardlink_to`, as the 1169 argument order of :meth:`Path.link_to` does not match that of 1170 :meth:`Path.symlink_to`. 1171 1172 1173.. method:: Path.touch(mode=0o666, exist_ok=True) 1174 1175 Create a file at this given path. If *mode* is given, it is combined 1176 with the process' ``umask`` value to determine the file mode and access 1177 flags. If the file already exists, the function succeeds if *exist_ok* 1178 is true (and its modification time is updated to the current time), 1179 otherwise :exc:`FileExistsError` is raised. 1180 1181 1182.. method:: Path.unlink(missing_ok=False) 1183 1184 Remove this file or symbolic link. If the path points to a directory, 1185 use :func:`Path.rmdir` instead. 1186 1187 If *missing_ok* is false (the default), :exc:`FileNotFoundError` is 1188 raised if the path does not exist. 1189 1190 If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be 1191 ignored (same behavior as the POSIX ``rm -f`` command). 1192 1193 .. versionchanged:: 3.8 1194 The *missing_ok* parameter was added. 1195 1196 1197.. method:: Path.write_bytes(data) 1198 1199 Open the file pointed to in bytes mode, write *data* to it, and close the 1200 file:: 1201 1202 >>> p = Path('my_binary_file') 1203 >>> p.write_bytes(b'Binary file contents') 1204 20 1205 >>> p.read_bytes() 1206 b'Binary file contents' 1207 1208 An existing file of the same name is overwritten. 1209 1210 .. versionadded:: 3.5 1211 1212 1213.. method:: Path.write_text(data, encoding=None, errors=None, newline=None) 1214 1215 Open the file pointed to in text mode, write *data* to it, and close the 1216 file:: 1217 1218 >>> p = Path('my_text_file') 1219 >>> p.write_text('Text file contents') 1220 18 1221 >>> p.read_text() 1222 'Text file contents' 1223 1224 An existing file of the same name is overwritten. The optional parameters 1225 have the same meaning as in :func:`open`. 1226 1227 .. versionadded:: 3.5 1228 1229 .. versionchanged:: 3.10 1230 The *newline* parameter was added. 1231 1232Correspondence to tools in the :mod:`os` module 1233----------------------------------------------- 1234 1235Below is a table mapping various :mod:`os` functions to their corresponding 1236:class:`PurePath`/:class:`Path` equivalent. 1237 1238.. note:: 1239 1240 Not all pairs of functions/methods below are equivalent. Some of them, 1241 despite having some overlapping use-cases, have different semantics. They 1242 include :func:`os.path.abspath` and :meth:`Path.resolve`, 1243 :func:`os.path.relpath` and :meth:`PurePath.relative_to`. 1244 1245==================================== ============================== 1246:mod:`os` and :mod:`os.path` :mod:`pathlib` 1247==================================== ============================== 1248:func:`os.path.abspath` :meth:`Path.resolve` [#]_ 1249:func:`os.chmod` :meth:`Path.chmod` 1250:func:`os.mkdir` :meth:`Path.mkdir` 1251:func:`os.makedirs` :meth:`Path.mkdir` 1252:func:`os.rename` :meth:`Path.rename` 1253:func:`os.replace` :meth:`Path.replace` 1254:func:`os.rmdir` :meth:`Path.rmdir` 1255:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink` 1256:func:`os.getcwd` :func:`Path.cwd` 1257:func:`os.path.exists` :meth:`Path.exists` 1258:func:`os.path.expanduser` :meth:`Path.expanduser` and 1259 :meth:`Path.home` 1260:func:`os.listdir` :meth:`Path.iterdir` 1261:func:`os.path.isdir` :meth:`Path.is_dir` 1262:func:`os.path.isfile` :meth:`Path.is_file` 1263:func:`os.path.islink` :meth:`Path.is_symlink` 1264:func:`os.link` :meth:`Path.hardlink_to` 1265:func:`os.symlink` :meth:`Path.symlink_to` 1266:func:`os.readlink` :meth:`Path.readlink` 1267:func:`os.path.relpath` :meth:`Path.relative_to` [#]_ 1268:func:`os.stat` :meth:`Path.stat`, 1269 :meth:`Path.owner`, 1270 :meth:`Path.group` 1271:func:`os.path.isabs` :meth:`PurePath.is_absolute` 1272:func:`os.path.join` :func:`PurePath.joinpath` 1273:func:`os.path.basename` :data:`PurePath.name` 1274:func:`os.path.dirname` :data:`PurePath.parent` 1275:func:`os.path.samefile` :meth:`Path.samefile` 1276:func:`os.path.splitext` :data:`PurePath.suffix` 1277==================================== ============================== 1278 1279.. rubric:: Footnotes 1280 1281.. [#] :func:`os.path.abspath` does not resolve symbolic links while :meth:`Path.resolve` does. 1282.. [#] :meth:`Path.relative_to` requires ``self`` to be the subpath of the argument, but :func:`os.path.relpath` does not. 1283