blob: 450e8ff378a3a5b28176831c45e61890d4088b0e [file] [log] [blame]
Antoine Pitrou31119e42013-11-22 17:38:12 +01001
2:mod:`pathlib` --- Object-oriented filesystem paths
3===================================================
4
5.. module:: pathlib
6 :synopsis: Object-oriented filesystem paths
7
Terry Jan Reedyfa089b92016-06-11 15:02:54 -04008.. versionadded:: 3.4
9
10**Source code:** :source:`Lib/pathlib.py`
11
Antoine Pitrou31119e42013-11-22 17:38:12 +010012.. index:: single: path; operations
13
Terry Jan Reedyfa089b92016-06-11 15:02:54 -040014--------------
Antoine Pitrou31119e42013-11-22 17:38:12 +010015
Antoine Pitrou31119e42013-11-22 17:38:12 +010016This 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
Eli Benderskyb6e66eb2013-11-28 06:53:05 -080022.. 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.
Antoine Pitrou31119e42013-11-22 17:38:12 +010037
Antoine Pitrou31119e42013-11-22 17:38:12 +010038.. 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
Eli Benderskyb6e66eb2013-11-28 06:53:05 -080099.. class:: PurePath(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100100
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800101 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
Antoine Pitrou8ad751e2015-04-12 00:08:02 +0200107 Each element of *pathsegments* can be either a string representing a
Brett Cannon568be632016-06-10 12:20:49 -0700108 path segment, an object implementing the :class:`os.PathLike` interface
109 which returns a string, or another path object::
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800110
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
Brett Cannon568be632016-06-10 12:20:49 -0700150 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
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800156.. class:: PurePosixPath(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100157
158 A subclass of :class:`PurePath`, this path flavour represents non-Windows
159 filesystem paths::
160
161 >>> PurePosixPath('/etc')
162 PurePosixPath('/etc')
163
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800164 *pathsegments* is specified similarly to :class:`PurePath`.
165
166.. class:: PureWindowsPath(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100167
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
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800174 *pathsegments* is specified similarly to :class:`PurePath`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100175
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
Antoine Pitrou31119e42013-11-22 17:38:12 +0100180General 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>
Victor Stinner91108f02015-10-14 18:25:31 +0200203 TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
Antoine Pitrou31119e42013-11-22 17:38:12 +0100204
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
Brett Cannon568be632016-06-10 12:20:49 -0700220A 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
Antoine Pitrou31119e42013-11-22 17:38:12 +0100228The 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
Marco Buttu7b2491a2017-04-13 16:17:59 +0200274.. testsetup::
275
276 from pathlib import PurePosixPath, PureWindowsPath
277
Andrew Kuchling7a4e2d12013-11-22 15:45:02 -0500278Pure paths provide the following methods and properties:
Antoine Pitrou31119e42013-11-22 17:38:12 +0100279
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
340.. data:: PurePath.parent
341
342 The logical parent of the path::
343
344 >>> p = PurePosixPath('/a/b/c/d')
345 >>> p.parent
346 PurePosixPath('/a/b/c')
347
348 You cannot go past an anchor, or empty path::
349
350 >>> p = PurePosixPath('/')
351 >>> p.parent
352 PurePosixPath('/')
353 >>> p = PurePosixPath('.')
354 >>> p.parent
355 PurePosixPath('.')
356
357 .. note::
358 This is a purely lexical operation, hence the following behaviour::
359
360 >>> p = PurePosixPath('foo/..')
361 >>> p.parent
362 PurePosixPath('foo')
363
364 If you want to walk an arbitrary filesystem path upwards, it is
365 recommended to first call :meth:`Path.resolve` so as to resolve
366 symlinks and eliminate `".."` components.
367
368
369.. data:: PurePath.name
370
371 A string representing the final path component, excluding the drive and
372 root, if any::
373
374 >>> PurePosixPath('my/library/setup.py').name
375 'setup.py'
376
377 UNC drive names are not considered::
378
379 >>> PureWindowsPath('//some/share/setup.py').name
380 'setup.py'
381 >>> PureWindowsPath('//some/share').name
382 ''
383
384
385.. data:: PurePath.suffix
386
387 The file extension of the final component, if any::
388
389 >>> PurePosixPath('my/library/setup.py').suffix
390 '.py'
391 >>> PurePosixPath('my/library.tar.gz').suffix
392 '.gz'
393 >>> PurePosixPath('my/library').suffix
394 ''
395
396
397.. data:: PurePath.suffixes
398
399 A list of the path's file extensions::
400
401 >>> PurePosixPath('my/library.tar.gar').suffixes
402 ['.tar', '.gar']
403 >>> PurePosixPath('my/library.tar.gz').suffixes
404 ['.tar', '.gz']
405 >>> PurePosixPath('my/library').suffixes
406 []
407
408
409.. data:: PurePath.stem
410
411 The final path component, without its suffix::
412
413 >>> PurePosixPath('my/library.tar.gz').stem
414 'library.tar'
415 >>> PurePosixPath('my/library.tar').stem
416 'library'
417 >>> PurePosixPath('my/library').stem
418 'library'
419
420
421.. method:: PurePath.as_posix()
422
423 Return a string representation of the path with forward slashes (``/``)::
424
425 >>> p = PureWindowsPath('c:\\windows')
426 >>> str(p)
427 'c:\\windows'
428 >>> p.as_posix()
429 'c:/windows'
430
431
432.. method:: PurePath.as_uri()
433
434 Represent the path as a ``file`` URI. :exc:`ValueError` is raised if
435 the path isn't absolute.
436
437 >>> p = PurePosixPath('/etc/passwd')
438 >>> p.as_uri()
439 'file:///etc/passwd'
440 >>> p = PureWindowsPath('c:/Windows')
441 >>> p.as_uri()
442 'file:///c:/Windows'
443
444
445.. method:: PurePath.is_absolute()
446
447 Return whether the path is absolute or not. A path is considered absolute
448 if it has both a root and (if the flavour allows) a drive::
449
450 >>> PurePosixPath('/a/b').is_absolute()
451 True
452 >>> PurePosixPath('a/b').is_absolute()
453 False
454
455 >>> PureWindowsPath('c:/a/b').is_absolute()
456 True
457 >>> PureWindowsPath('/a/b').is_absolute()
458 False
459 >>> PureWindowsPath('c:').is_absolute()
460 False
461 >>> PureWindowsPath('//some/share').is_absolute()
462 True
463
464
465.. method:: PurePath.is_reserved()
466
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200467 With :class:`PureWindowsPath`, return ``True`` if the path is considered
468 reserved under Windows, ``False`` otherwise. With :class:`PurePosixPath`,
469 ``False`` is always returned.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100470
471 >>> PureWindowsPath('nul').is_reserved()
472 True
473 >>> PurePosixPath('nul').is_reserved()
474 False
475
476 File system calls on reserved paths can fail mysteriously or have
477 unintended effects.
478
479
480.. method:: PurePath.joinpath(*other)
481
Andrew Kuchling7a4e2d12013-11-22 15:45:02 -0500482 Calling this method is equivalent to combining the path with each of
Antoine Pitrou31119e42013-11-22 17:38:12 +0100483 the *other* arguments in turn::
484
485 >>> PurePosixPath('/etc').joinpath('passwd')
486 PurePosixPath('/etc/passwd')
487 >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
488 PurePosixPath('/etc/passwd')
489 >>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
490 PurePosixPath('/etc/init.d/apache2')
491 >>> PureWindowsPath('c:').joinpath('/Program Files')
492 PureWindowsPath('c:/Program Files')
493
494
495.. method:: PurePath.match(pattern)
496
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200497 Match this path against the provided glob-style pattern. Return ``True``
498 if matching is successful, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100499
500 If *pattern* is relative, the path can be either relative or absolute,
501 and matching is done from the right::
502
503 >>> PurePath('a/b.py').match('*.py')
504 True
505 >>> PurePath('/a/b/c.py').match('b/*.py')
506 True
507 >>> PurePath('/a/b/c.py').match('a/*.py')
508 False
509
510 If *pattern* is absolute, the path must be absolute, and the whole path
511 must match::
512
513 >>> PurePath('/a.py').match('/*.py')
514 True
515 >>> PurePath('a/b.py').match('/*.py')
516 False
517
518 As with other methods, case-sensitivity is observed::
519
520 >>> PureWindowsPath('b.py').match('*.PY')
521 True
522
523
524.. method:: PurePath.relative_to(*other)
525
526 Compute a version of this path relative to the path represented by
527 *other*. If it's impossible, ValueError is raised::
528
529 >>> p = PurePosixPath('/etc/passwd')
530 >>> p.relative_to('/')
531 PurePosixPath('etc/passwd')
532 >>> p.relative_to('/etc')
533 PurePosixPath('passwd')
534 >>> p.relative_to('/usr')
535 Traceback (most recent call last):
536 File "<stdin>", line 1, in <module>
537 File "pathlib.py", line 694, in relative_to
538 .format(str(self), str(formatted)))
539 ValueError: '/etc/passwd' does not start with '/usr'
540
541
Antoine Pitrouef851192014-02-25 20:33:02 +0100542.. method:: PurePath.with_name(name)
543
544 Return a new path with the :attr:`name` changed. If the original path
545 doesn't have a name, ValueError is raised::
546
547 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
548 >>> p.with_name('setup.py')
549 PureWindowsPath('c:/Downloads/setup.py')
550 >>> p = PureWindowsPath('c:/')
551 >>> p.with_name('setup.py')
552 Traceback (most recent call last):
553 File "<stdin>", line 1, in <module>
554 File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
555 raise ValueError("%r has an empty name" % (self,))
556 ValueError: PureWindowsPath('c:/') has an empty name
557
558
559.. method:: PurePath.with_suffix(suffix)
560
561 Return a new path with the :attr:`suffix` changed. If the original path
Stefan Otte46dc4e32018-08-03 22:49:42 +0200562 doesn't have a suffix, the new *suffix* is appended instead. If the
563 *suffix* is an empty string, the original suffix is removed::
Antoine Pitrouef851192014-02-25 20:33:02 +0100564
565 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
566 >>> p.with_suffix('.bz2')
567 PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
568 >>> p = PureWindowsPath('README')
569 >>> p.with_suffix('.txt')
570 PureWindowsPath('README.txt')
Stefan Otte46dc4e32018-08-03 22:49:42 +0200571 >>> p = PureWindowsPath('README.txt')
572 >>> p.with_suffix('')
573 PureWindowsPath('README')
Antoine Pitrouef851192014-02-25 20:33:02 +0100574
575
Antoine Pitrou31119e42013-11-22 17:38:12 +0100576.. _concrete-paths:
577
578
579Concrete paths
580--------------
581
582Concrete paths are subclasses of the pure path classes. In addition to
583operations provided by the latter, they also provide methods to do system
584calls on path objects. There are three ways to instantiate concrete paths:
585
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800586.. class:: Path(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100587
588 A subclass of :class:`PurePath`, this class represents concrete paths of
589 the system's path flavour (instantiating it creates either a
590 :class:`PosixPath` or a :class:`WindowsPath`)::
591
592 >>> Path('setup.py')
593 PosixPath('setup.py')
594
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800595 *pathsegments* is specified similarly to :class:`PurePath`.
596
597.. class:: PosixPath(*pathsegments)
598
599 A subclass of :class:`Path` and :class:`PurePosixPath`, this class
600 represents concrete non-Windows filesystem paths::
601
602 >>> PosixPath('/etc')
603 PosixPath('/etc')
604
605 *pathsegments* is specified similarly to :class:`PurePath`.
606
607.. class:: WindowsPath(*pathsegments)
608
609 A subclass of :class:`Path` and :class:`PureWindowsPath`, this class
610 represents concrete Windows filesystem paths::
611
612 >>> WindowsPath('c:/Program Files/')
613 WindowsPath('c:/Program Files')
614
615 *pathsegments* is specified similarly to :class:`PurePath`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100616
617You can only instantiate the class flavour that corresponds to your system
618(allowing system calls on non-compatible path flavours could lead to
619bugs or failures in your application)::
620
621 >>> import os
622 >>> os.name
623 'posix'
624 >>> Path('setup.py')
625 PosixPath('setup.py')
626 >>> PosixPath('setup.py')
627 PosixPath('setup.py')
628 >>> WindowsPath('setup.py')
629 Traceback (most recent call last):
630 File "<stdin>", line 1, in <module>
631 File "pathlib.py", line 798, in __new__
632 % (cls.__name__,))
633 NotImplementedError: cannot instantiate 'WindowsPath' on your system
634
635
636Methods
637^^^^^^^
638
639Concrete paths provide the following methods in addition to pure paths
640methods. Many of these methods can raise an :exc:`OSError` if a system
Serhiy Storchaka0185f342018-09-18 11:28:51 +0300641call fails (for example because the path doesn't exist).
642
643.. versionchanged:: 3.8
644
645 :meth:`~Path.exists()`, :meth:`~Path.is_dir()`, :meth:`~Path.is_file()`,
646 :meth:`~Path.is_mount()`, :meth:`~Path.is_symlink()`,
647 :meth:`~Path.is_block_device()`, :meth:`~Path.is_char_device()`,
648 :meth:`~Path.is_fifo()`, :meth:`~Path.is_socket()` now return ``False``
649 instead of raising an exception for paths that contain characters
650 unrepresentable at the OS level.
651
Antoine Pitrou31119e42013-11-22 17:38:12 +0100652
653.. classmethod:: Path.cwd()
654
655 Return a new path object representing the current directory (as returned
656 by :func:`os.getcwd`)::
657
658 >>> Path.cwd()
659 PosixPath('/home/antoine/pathlib')
660
661
Antoine Pitrou17cba7d2015-01-12 21:03:41 +0100662.. classmethod:: Path.home()
663
664 Return a new path object representing the user's home directory (as
665 returned by :func:`os.path.expanduser` with ``~`` construct)::
666
667 >>> Path.home()
668 PosixPath('/home/antoine')
669
670 .. versionadded:: 3.5
671
672
Antoine Pitrou31119e42013-11-22 17:38:12 +0100673.. method:: Path.stat()
674
675 Return information about this path (similarly to :func:`os.stat`).
676 The result is looked up at each call to this method.
677
Marco Buttu7b2491a2017-04-13 16:17:59 +0200678 ::
679
Antoine Pitrou31119e42013-11-22 17:38:12 +0100680 >>> p = Path('setup.py')
681 >>> p.stat().st_size
682 956
683 >>> p.stat().st_mtime
684 1327883547.852554
685
686
687.. method:: Path.chmod(mode)
688
689 Change the file mode and permissions, like :func:`os.chmod`::
690
691 >>> p = Path('setup.py')
692 >>> p.stat().st_mode
693 33277
694 >>> p.chmod(0o444)
695 >>> p.stat().st_mode
696 33060
697
698
699.. method:: Path.exists()
700
701 Whether the path points to an existing file or directory::
702
703 >>> Path('.').exists()
704 True
705 >>> Path('setup.py').exists()
706 True
707 >>> Path('/etc').exists()
708 True
709 >>> Path('nonexistentfile').exists()
710 False
711
712 .. note::
713 If the path points to a symlink, :meth:`exists` returns whether the
714 symlink *points to* an existing file or directory.
715
716
Antoine Pitrou8477ed62014-12-30 20:54:45 +0100717.. method:: Path.expanduser()
718
719 Return a new path with expanded ``~`` and ``~user`` constructs,
720 as returned by :meth:`os.path.expanduser`::
721
722 >>> p = PosixPath('~/films/Monty Python')
723 >>> p.expanduser()
724 PosixPath('/home/eric/films/Monty Python')
725
726 .. versionadded:: 3.5
727
728
Antoine Pitrou31119e42013-11-22 17:38:12 +0100729.. method:: Path.glob(pattern)
730
Eivind Teig537b6ca2019-02-11 11:47:09 +0100731 Glob the given relative *pattern* in the directory represented by this path,
Antoine Pitrou31119e42013-11-22 17:38:12 +0100732 yielding all matching files (of any kind)::
733
734 >>> sorted(Path('.').glob('*.py'))
735 [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
736 >>> sorted(Path('.').glob('*/*.py'))
737 [PosixPath('docs/conf.py')]
738
739 The "``**``" pattern means "this directory and all subdirectories,
740 recursively". In other words, it enables recursive globbing::
741
742 >>> sorted(Path('.').glob('**/*.py'))
743 [PosixPath('build/lib/pathlib.py'),
744 PosixPath('docs/conf.py'),
745 PosixPath('pathlib.py'),
746 PosixPath('setup.py'),
747 PosixPath('test_pathlib.py')]
748
749 .. note::
750 Using the "``**``" pattern in large directory trees may consume
751 an inordinate amount of time.
752
753
754.. method:: Path.group()
755
Ned Deilyc0341562013-11-27 14:42:55 -0800756 Return the name of the group owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100757 if the file's gid isn't found in the system database.
758
759
760.. method:: Path.is_dir()
761
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200762 Return ``True`` if the path points to a directory (or a symbolic link
763 pointing to a directory), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100764
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200765 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100766 other errors (such as permission errors) are propagated.
767
768
769.. method:: Path.is_file()
770
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200771 Return ``True`` if the path points to a regular file (or a symbolic link
772 pointing to a regular file), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100773
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200774 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100775 other errors (such as permission errors) are propagated.
776
777
Łukasz Langa47320a62017-08-01 16:47:50 -0700778.. method:: Path.is_mount()
779
780 Return ``True`` if the path is a :dfn:`mount point`: a point in a
781 file system where a different file system has been mounted. On POSIX, the
782 function checks whether *path*'s parent, :file:`path/..`, is on a different
783 device than *path*, or whether :file:`path/..` and *path* point to the same
784 i-node on the same device --- this should detect mount points for all Unix
785 and POSIX variants. Not implemented on Windows.
786
787 .. versionadded:: 3.7
788
789
Antoine Pitrou31119e42013-11-22 17:38:12 +0100790.. method:: Path.is_symlink()
791
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200792 Return ``True`` if the path points to a symbolic link, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100793
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200794 ``False`` is also returned if the path doesn't exist; other errors (such
Antoine Pitrou31119e42013-11-22 17:38:12 +0100795 as permission errors) are propagated.
796
797
798.. method:: Path.is_socket()
799
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200800 Return ``True`` if the path points to a Unix socket (or a symbolic link
801 pointing to a Unix socket), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100802
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200803 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100804 other errors (such as permission errors) are propagated.
805
806
807.. method:: Path.is_fifo()
808
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200809 Return ``True`` if the path points to a FIFO (or a symbolic link
810 pointing to a FIFO), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100811
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200812 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100813 other errors (such as permission errors) are propagated.
814
815
816.. method:: Path.is_block_device()
817
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200818 Return ``True`` if the path points to a block device (or a symbolic link
819 pointing to a block device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100820
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200821 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100822 other errors (such as permission errors) are propagated.
823
824
825.. method:: Path.is_char_device()
826
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200827 Return ``True`` if the path points to a character device (or a symbolic link
828 pointing to a character device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100829
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200830 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100831 other errors (such as permission errors) are propagated.
832
833
834.. method:: Path.iterdir()
835
836 When the path points to a directory, yield path objects of the directory
837 contents::
838
839 >>> p = Path('docs')
840 >>> for child in p.iterdir(): child
841 ...
842 PosixPath('docs/conf.py')
843 PosixPath('docs/_templates')
844 PosixPath('docs/make.bat')
845 PosixPath('docs/index.rst')
846 PosixPath('docs/_build')
847 PosixPath('docs/_static')
848 PosixPath('docs/Makefile')
849
850.. method:: Path.lchmod(mode)
851
852 Like :meth:`Path.chmod` but, if the path points to a symbolic link, the
853 symbolic link's mode is changed rather than its target's.
854
855
856.. method:: Path.lstat()
857
858 Like :meth:`Path.stat` but, if the path points to a symbolic link, return
859 the symbolic link's information rather than its target's.
860
861
Barry Warsaw7c549c42014-08-05 11:28:12 -0400862.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100863
864 Create a new directory at this given path. If *mode* is given, it is
865 combined with the process' ``umask`` value to determine the file mode
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100866 and access flags. If the path already exists, :exc:`FileExistsError`
867 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100868
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200869 If *parents* is true, any missing parents of this path are created
Antoine Pitrou0048c982013-12-16 20:22:37 +0100870 as needed; they are created with the default permissions without taking
871 *mode* into account (mimicking the POSIX ``mkdir -p`` command).
872
873 If *parents* is false (the default), a missing parent raises
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100874 :exc:`FileNotFoundError`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100875
Ned Deily11194f72016-10-15 15:12:03 -0400876 If *exist_ok* is false (the default), :exc:`FileExistsError` is
Barry Warsaw7c549c42014-08-05 11:28:12 -0400877 raised if the target directory already exists.
878
879 If *exist_ok* is true, :exc:`FileExistsError` exceptions will be
880 ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the
881 last path component is not an existing non-directory file.
882
883 .. versionchanged:: 3.5
884 The *exist_ok* parameter was added.
885
Antoine Pitrou31119e42013-11-22 17:38:12 +0100886
887.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
888
889 Open the file pointed to by the path, like the built-in :func:`open`
890 function does::
891
892 >>> p = Path('setup.py')
893 >>> with p.open() as f:
894 ... f.readline()
895 ...
896 '#!/usr/bin/env python3\n'
897
898
899.. method:: Path.owner()
900
Ned Deilyc0341562013-11-27 14:42:55 -0800901 Return the name of the user owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100902 if the file's uid isn't found in the system database.
903
904
Georg Brandlea683982014-10-01 19:12:33 +0200905.. method:: Path.read_bytes()
906
907 Return the binary contents of the pointed-to file as a bytes object::
908
909 >>> p = Path('my_binary_file')
910 >>> p.write_bytes(b'Binary file contents')
911 20
912 >>> p.read_bytes()
913 b'Binary file contents'
914
915 .. versionadded:: 3.5
916
917
918.. method:: Path.read_text(encoding=None, errors=None)
919
920 Return the decoded contents of the pointed-to file as a string::
921
922 >>> p = Path('my_text_file')
923 >>> p.write_text('Text file contents')
924 18
925 >>> p.read_text()
926 'Text file contents'
927
Xtreak5b2657f2018-08-07 01:25:03 +0530928 The file is opened and then closed. The optional parameters have the same
929 meaning as in :func:`open`.
Georg Brandlea683982014-10-01 19:12:33 +0200930
931 .. versionadded:: 3.5
932
933
Antoine Pitrou31119e42013-11-22 17:38:12 +0100934.. method:: Path.rename(target)
935
Berker Peksag2b879212016-07-14 07:44:59 +0300936 Rename this file or directory to the given *target*. On Unix, if
937 *target* exists and is a file, it will be replaced silently if the user
938 has permission. *target* can be either a string or another path object::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100939
940 >>> p = Path('foo')
941 >>> p.open('w').write('some text')
942 9
943 >>> target = Path('bar')
944 >>> p.rename(target)
945 >>> target.open().read()
946 'some text'
947
948
949.. method:: Path.replace(target)
950
951 Rename this file or directory to the given *target*. If *target* points
952 to an existing file or directory, it will be unconditionally replaced.
953
954
Steve Dower98eb3602016-11-09 12:58:17 -0800955.. method:: Path.resolve(strict=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100956
957 Make the path absolute, resolving any symlinks. A new path object is
958 returned::
959
960 >>> p = Path()
961 >>> p
962 PosixPath('.')
963 >>> p.resolve()
964 PosixPath('/home/antoine/pathlib')
965
Berker Peksag5e3677d2016-10-01 01:06:52 +0300966 "``..``" components are also eliminated (this is the only method to do so)::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100967
968 >>> p = Path('docs/../setup.py')
969 >>> p.resolve()
970 PosixPath('/home/antoine/pathlib/setup.py')
971
Steve Dower98eb3602016-11-09 12:58:17 -0800972 If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError`
973 is raised. If *strict* is ``False``, the path is resolved as far as possible
974 and any remainder is appended without checking whether it exists. If an
975 infinite loop is encountered along the resolution path, :exc:`RuntimeError`
976 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100977
Steve Dower98eb3602016-11-09 12:58:17 -0800978 .. versionadded:: 3.6
979 The *strict* argument.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100980
981.. method:: Path.rglob(pattern)
982
Eivind Teig537b6ca2019-02-11 11:47:09 +0100983 This is like calling :func:`Path.glob` with "``**/``" added in front of the
984 given relative *pattern*::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100985
986 >>> sorted(Path().rglob("*.py"))
987 [PosixPath('build/lib/pathlib.py'),
988 PosixPath('docs/conf.py'),
989 PosixPath('pathlib.py'),
990 PosixPath('setup.py'),
991 PosixPath('test_pathlib.py')]
992
993
994.. method:: Path.rmdir()
995
996 Remove this directory. The directory must be empty.
997
998
Antoine Pitrou43e3d942014-05-13 10:50:15 +0200999.. method:: Path.samefile(other_path)
1000
1001 Return whether this path points to the same file as *other_path*, which
1002 can be either a Path object, or a string. The semantics are similar
1003 to :func:`os.path.samefile` and :func:`os.path.samestat`.
1004
1005 An :exc:`OSError` can be raised if either file cannot be accessed for some
1006 reason.
1007
Marco Buttu7b2491a2017-04-13 16:17:59 +02001008 ::
1009
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001010 >>> p = Path('spam')
1011 >>> q = Path('eggs')
1012 >>> p.samefile(q)
1013 False
1014 >>> p.samefile('spam')
1015 True
1016
1017 .. versionadded:: 3.5
1018
1019
Antoine Pitrou31119e42013-11-22 17:38:12 +01001020.. method:: Path.symlink_to(target, target_is_directory=False)
1021
1022 Make this path a symbolic link to *target*. Under Windows,
Serhiy Storchaka03cc5652013-11-26 21:37:12 +02001023 *target_is_directory* must be true (default ``False``) if the link's target
Antoine Pitrou31119e42013-11-22 17:38:12 +01001024 is a directory. Under POSIX, *target_is_directory*'s value is ignored.
1025
Marco Buttu7b2491a2017-04-13 16:17:59 +02001026 ::
1027
Antoine Pitrou31119e42013-11-22 17:38:12 +01001028 >>> p = Path('mylink')
1029 >>> p.symlink_to('setup.py')
1030 >>> p.resolve()
1031 PosixPath('/home/antoine/pathlib/setup.py')
1032 >>> p.stat().st_size
1033 956
1034 >>> p.lstat().st_size
1035 8
1036
1037 .. note::
1038 The order of arguments (link, target) is the reverse
1039 of :func:`os.symlink`'s.
1040
1041
Zachary Ware7a26da52016-08-09 17:10:39 -05001042.. method:: Path.touch(mode=0o666, exist_ok=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001043
1044 Create a file at this given path. If *mode* is given, it is combined
1045 with the process' ``umask`` value to determine the file mode and access
1046 flags. If the file already exists, the function succeeds if *exist_ok*
1047 is true (and its modification time is updated to the current time),
Antoine Pitrouf6abb702013-12-16 21:00:53 +01001048 otherwise :exc:`FileExistsError` is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001049
1050
1051.. method:: Path.unlink()
1052
1053 Remove this file or symbolic link. If the path points to a directory,
1054 use :func:`Path.rmdir` instead.
Georg Brandlea683982014-10-01 19:12:33 +02001055
1056
1057.. method:: Path.write_bytes(data)
1058
1059 Open the file pointed to in bytes mode, write *data* to it, and close the
1060 file::
1061
1062 >>> p = Path('my_binary_file')
1063 >>> p.write_bytes(b'Binary file contents')
1064 20
1065 >>> p.read_bytes()
1066 b'Binary file contents'
1067
1068 An existing file of the same name is overwritten.
1069
1070 .. versionadded:: 3.5
1071
1072
1073.. method:: Path.write_text(data, encoding=None, errors=None)
1074
1075 Open the file pointed to in text mode, write *data* to it, and close the
1076 file::
1077
1078 >>> p = Path('my_text_file')
1079 >>> p.write_text('Text file contents')
1080 18
1081 >>> p.read_text()
1082 'Text file contents'
1083
Georg Brandlea683982014-10-01 19:12:33 +02001084 .. versionadded:: 3.5
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001085
1086Correspondence to tools in the :mod:`os` module
1087-----------------------------------------------
1088
1089Below is a table mapping various :mod:`os` functions to their corresponding
1090:class:`PurePath`/:class:`Path` equivalent.
1091
1092.. note::
1093
1094 Although :func:`os.path.relpath` and :meth:`PurePath.relative_to` have some
1095 overlapping use-cases, their semantics differ enough to warrant not
1096 considering them equivalent.
1097
Xtreak6f9c55d2018-10-05 20:54:11 +05301098==================================== ==============================
1099os and os.path pathlib
1100==================================== ==============================
1101:func:`os.path.abspath` :meth:`Path.resolve`
1102:func:`os.chmod` :meth:`Path.chmod`
1103:func:`os.mkdir` :meth:`Path.mkdir`
1104:func:`os.rename` :meth:`Path.rename`
1105:func:`os.replace` :meth:`Path.replace`
1106:func:`os.rmdir` :meth:`Path.rmdir`
1107:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink`
1108:func:`os.getcwd` :func:`Path.cwd`
1109:func:`os.path.exists` :meth:`Path.exists`
1110:func:`os.path.expanduser` :meth:`Path.expanduser` and
1111 :meth:`Path.home`
1112:func:`os.path.isdir` :meth:`Path.is_dir`
1113:func:`os.path.isfile` :meth:`Path.is_file`
1114:func:`os.path.islink` :meth:`Path.is_symlink`
1115:func:`os.stat` :meth:`Path.stat`,
1116 :meth:`Path.owner`,
1117 :meth:`Path.group`
1118:func:`os.path.isabs` :meth:`PurePath.is_absolute`
1119:func:`os.path.join` :func:`PurePath.joinpath`
1120:func:`os.path.basename` :data:`PurePath.name`
1121:func:`os.path.dirname` :data:`PurePath.parent`
1122:func:`os.path.samefile` :meth:`Path.samefile`
1123:func:`os.path.splitext` :data:`PurePath.suffix`
1124==================================== ==============================