blob: a7ce18df3362bae8c363a7f124803eba6ffb0af8 [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
8.. index:: single: path; operations
9
10.. versionadded:: 3.4
11
Antoine Pitrou31119e42013-11-22 17:38:12 +010012This module offers classes representing filesystem paths with semantics
13appropriate for different operating systems. Path classes are divided
14between :ref:`pure paths <pure-paths>`, which provide purely computational
15operations without I/O, and :ref:`concrete paths <concrete-paths>`, which
16inherit from pure paths but also provide I/O operations.
17
Eli Benderskyb6e66eb2013-11-28 06:53:05 -080018.. image:: pathlib-inheritance.png
19 :align: center
20
21If you've never used this module before or just aren't sure which class is
22right for your task, :class:`Path` is most likely what you need. It instantiates
23a :ref:`concrete path <concrete-paths>` for the platform the code is running on.
24
25Pure paths are useful in some special cases; for example:
26
27#. If you want to manipulate Windows paths on a Unix machine (or vice versa).
28 You cannot instantiate a :class:`WindowsPath` when running on Unix, but you
29 can instantiate :class:`PureWindowsPath`.
30#. You want to make sure that your code only manipulates paths without actually
31 accessing the OS. In this case, instantiating one of the pure classes may be
32 useful since those simply don't have any OS-accessing operations.
Antoine Pitrou31119e42013-11-22 17:38:12 +010033
34.. note::
Andrew Kuchling7a4e2d12013-11-22 15:45:02 -050035 This module has been included in the standard library on a
Antoine Pitrou31119e42013-11-22 17:38:12 +010036 :term:`provisional basis <provisional package>`. Backwards incompatible
37 changes (up to and including removal of the package) may occur if deemed
38 necessary by the core developers.
39
40.. seealso::
41 :pep:`428`: The pathlib module -- object-oriented filesystem paths.
42
43.. seealso::
44 For low-level path manipulation on strings, you can also use the
45 :mod:`os.path` module.
46
47
48Basic use
49---------
50
51Importing the main class::
52
53 >>> from pathlib import Path
54
55Listing subdirectories::
56
57 >>> p = Path('.')
58 >>> [x for x in p.iterdir() if x.is_dir()]
59 [PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),
60 PosixPath('__pycache__'), PosixPath('build')]
61
62Listing Python source files in this directory tree::
63
64 >>> list(p.glob('**/*.py'))
65 [PosixPath('test_pathlib.py'), PosixPath('setup.py'),
66 PosixPath('pathlib.py'), PosixPath('docs/conf.py'),
67 PosixPath('build/lib/pathlib.py')]
68
69Navigating inside a directory tree::
70
71 >>> p = Path('/etc')
72 >>> q = p / 'init.d' / 'reboot'
73 >>> q
74 PosixPath('/etc/init.d/reboot')
75 >>> q.resolve()
76 PosixPath('/etc/rc.d/init.d/halt')
77
78Querying path properties::
79
80 >>> q.exists()
81 True
82 >>> q.is_dir()
83 False
84
85Opening a file::
86
87 >>> with q.open() as f: f.readline()
88 ...
89 '#!/bin/bash\n'
90
91
92.. _pure-paths:
93
94Pure paths
95----------
96
97Pure path objects provide path-handling operations which don't actually
98access a filesystem. There are three ways to access these classes, which
99we also call *flavours*:
100
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800101.. class:: PurePath(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100102
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800103 A generic class that represents the system's path flavour (instantiating
104 it creates either a :class:`PurePosixPath` or a :class:`PureWindowsPath`)::
105
106 >>> PurePath('setup.py') # Running on a Unix machine
107 PurePosixPath('setup.py')
108
Antoine Pitrou8ad751e2015-04-12 00:08:02 +0200109 Each element of *pathsegments* can be either a string representing a
110 path segment, or another path object::
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800111
112 >>> PurePath('foo', 'some/path', 'bar')
113 PurePosixPath('foo/some/path/bar')
114 >>> PurePath(Path('foo'), Path('bar'))
115 PurePosixPath('foo/bar')
116
117 When *pathsegments* is empty, the current directory is assumed::
118
119 >>> PurePath()
120 PurePosixPath('.')
121
122 When several absolute paths are given, the last is taken as an anchor
123 (mimicking :func:`os.path.join`'s behaviour)::
124
125 >>> PurePath('/etc', '/usr', 'lib64')
126 PurePosixPath('/usr/lib64')
127 >>> PureWindowsPath('c:/Windows', 'd:bar')
128 PureWindowsPath('d:bar')
129
130 However, in a Windows path, changing the local root doesn't discard the
131 previous drive setting::
132
133 >>> PureWindowsPath('c:/Windows', '/Program Files')
134 PureWindowsPath('c:/Program Files')
135
136 Spurious slashes and single dots are collapsed, but double dots (``'..'``)
137 are not, since this would change the meaning of a path in the face of
138 symbolic links::
139
140 >>> PurePath('foo//bar')
141 PurePosixPath('foo/bar')
142 >>> PurePath('foo/./bar')
143 PurePosixPath('foo/bar')
144 >>> PurePath('foo/../bar')
145 PurePosixPath('foo/../bar')
146
147 (a naïve approach would make ``PurePosixPath('foo/../bar')`` equivalent
148 to ``PurePosixPath('bar')``, which is wrong if ``foo`` is a symbolic link
149 to another directory)
150
151.. class:: PurePosixPath(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100152
153 A subclass of :class:`PurePath`, this path flavour represents non-Windows
154 filesystem paths::
155
156 >>> PurePosixPath('/etc')
157 PurePosixPath('/etc')
158
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800159 *pathsegments* is specified similarly to :class:`PurePath`.
160
161.. class:: PureWindowsPath(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100162
163 A subclass of :class:`PurePath`, this path flavour represents Windows
164 filesystem paths::
165
166 >>> PureWindowsPath('c:/Program Files/')
167 PureWindowsPath('c:/Program Files')
168
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800169 *pathsegments* is specified similarly to :class:`PurePath`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100170
171Regardless of the system you're running on, you can instantiate all of
172these classes, since they don't provide any operation that does system calls.
173
174
Antoine Pitrou31119e42013-11-22 17:38:12 +0100175General properties
176^^^^^^^^^^^^^^^^^^
177
178Paths are immutable and hashable. Paths of a same flavour are comparable
179and orderable. These properties respect the flavour's case-folding
180semantics::
181
182 >>> PurePosixPath('foo') == PurePosixPath('FOO')
183 False
184 >>> PureWindowsPath('foo') == PureWindowsPath('FOO')
185 True
186 >>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }
187 True
188 >>> PureWindowsPath('C:') < PureWindowsPath('d:')
189 True
190
191Paths of a different flavour compare unequal and cannot be ordered::
192
193 >>> PureWindowsPath('foo') == PurePosixPath('foo')
194 False
195 >>> PureWindowsPath('foo') < PurePosixPath('foo')
196 Traceback (most recent call last):
197 File "<stdin>", line 1, in <module>
198 TypeError: unorderable types: PureWindowsPath() < PurePosixPath()
199
200
201Operators
202^^^^^^^^^
203
204The slash operator helps create child paths, similarly to :func:`os.path.join`::
205
206 >>> p = PurePath('/etc')
207 >>> p
208 PurePosixPath('/etc')
209 >>> p / 'init.d' / 'apache2'
210 PurePosixPath('/etc/init.d/apache2')
211 >>> q = PurePath('bin')
212 >>> '/usr' / q
213 PurePosixPath('/usr/bin')
214
215The string representation of a path is the raw filesystem path itself
216(in native form, e.g. with backslashes under Windows), which you can
217pass to any function taking a file path as a string::
218
219 >>> p = PurePath('/etc')
220 >>> str(p)
221 '/etc'
222 >>> p = PureWindowsPath('c:/Program Files')
223 >>> str(p)
224 'c:\\Program Files'
225
226Similarly, calling :class:`bytes` on a path gives the raw filesystem path as a
227bytes object, as encoded by :func:`os.fsencode`::
228
229 >>> bytes(p)
230 b'/etc'
231
232.. note::
233 Calling :class:`bytes` is only recommended under Unix. Under Windows,
234 the unicode form is the canonical representation of filesystem paths.
235
236
237Accessing individual parts
238^^^^^^^^^^^^^^^^^^^^^^^^^^
239
240To access the individual "parts" (components) of a path, use the following
241property:
242
243.. data:: PurePath.parts
244
245 A tuple giving access to the path's various components::
246
247 >>> p = PurePath('/usr/bin/python3')
248 >>> p.parts
249 ('/', 'usr', 'bin', 'python3')
250
251 >>> p = PureWindowsPath('c:/Program Files/PSF')
252 >>> p.parts
253 ('c:\\', 'Program Files', 'PSF')
254
255 (note how the drive and local root are regrouped in a single part)
256
257
258Methods and properties
259^^^^^^^^^^^^^^^^^^^^^^
260
Andrew Kuchling7a4e2d12013-11-22 15:45:02 -0500261Pure paths provide the following methods and properties:
Antoine Pitrou31119e42013-11-22 17:38:12 +0100262
263.. data:: PurePath.drive
264
265 A string representing the drive letter or name, if any::
266
267 >>> PureWindowsPath('c:/Program Files/').drive
268 'c:'
269 >>> PureWindowsPath('/Program Files/').drive
270 ''
271 >>> PurePosixPath('/etc').drive
272 ''
273
274 UNC shares are also considered drives::
275
276 >>> PureWindowsPath('//host/share/foo.txt').drive
277 '\\\\host\\share'
278
279.. data:: PurePath.root
280
281 A string representing the (local or global) root, if any::
282
283 >>> PureWindowsPath('c:/Program Files/').root
284 '\\'
285 >>> PureWindowsPath('c:Program Files/').root
286 ''
287 >>> PurePosixPath('/etc').root
288 '/'
289
290 UNC shares always have a root::
291
292 >>> PureWindowsPath('//host/share').root
293 '\\'
294
295.. data:: PurePath.anchor
296
297 The concatenation of the drive and root::
298
299 >>> PureWindowsPath('c:/Program Files/').anchor
300 'c:\\'
301 >>> PureWindowsPath('c:Program Files/').anchor
302 'c:'
303 >>> PurePosixPath('/etc').anchor
304 '/'
305 >>> PureWindowsPath('//host/share').anchor
306 '\\\\host\\share\\'
307
308
309.. data:: PurePath.parents
310
311 An immutable sequence providing access to the logical ancestors of
312 the path::
313
314 >>> p = PureWindowsPath('c:/foo/bar/setup.py')
315 >>> p.parents[0]
316 PureWindowsPath('c:/foo/bar')
317 >>> p.parents[1]
318 PureWindowsPath('c:/foo')
319 >>> p.parents[2]
320 PureWindowsPath('c:/')
321
322
323.. data:: PurePath.parent
324
325 The logical parent of the path::
326
327 >>> p = PurePosixPath('/a/b/c/d')
328 >>> p.parent
329 PurePosixPath('/a/b/c')
330
331 You cannot go past an anchor, or empty path::
332
333 >>> p = PurePosixPath('/')
334 >>> p.parent
335 PurePosixPath('/')
336 >>> p = PurePosixPath('.')
337 >>> p.parent
338 PurePosixPath('.')
339
340 .. note::
341 This is a purely lexical operation, hence the following behaviour::
342
343 >>> p = PurePosixPath('foo/..')
344 >>> p.parent
345 PurePosixPath('foo')
346
347 If you want to walk an arbitrary filesystem path upwards, it is
348 recommended to first call :meth:`Path.resolve` so as to resolve
349 symlinks and eliminate `".."` components.
350
351
352.. data:: PurePath.name
353
354 A string representing the final path component, excluding the drive and
355 root, if any::
356
357 >>> PurePosixPath('my/library/setup.py').name
358 'setup.py'
359
360 UNC drive names are not considered::
361
362 >>> PureWindowsPath('//some/share/setup.py').name
363 'setup.py'
364 >>> PureWindowsPath('//some/share').name
365 ''
366
367
Guido van Rossumdf859462016-01-06 11:15:52 -0800368.. data:: PurePath.path
369
370 A string representing the full path::
371
372 >>> PurePosixPath('my/library/setup.py').path
373 'my/library/setup.py'
374
375 This always returns the same value as ``str(p)``; it is included to
376 serve as a one-off protocol. Code that wants to support both
377 strings and ``pathlib.Path`` objects as filenames can write
378 ``arg = getattr(arg, 'path', arg)`` to get the path as a string.
379 This can then be passed to various system calls or library
380 functions that expect a string. Unlike the alternative
381 ``arg = str(arg)``, this will still raise an exception if an object
382 of some other type is given by accident.
383
Guido van Rossum1469d742016-01-06 11:36:03 -0800384 A nice advantage is that this protocol is also supported by
385 :class:`os.DirEntry` objects returned by :func:`os.scandir`.
386
Guido van Rossumb1360542016-01-06 11:23:31 -0800387 .. versionadded:: 3.4.5
Guido van Rossum1469d742016-01-06 11:36:03 -0800388 .. versionadded:: 3.5.2
Guido van Rossumdf859462016-01-06 11:15:52 -0800389
Antoine Pitrou31119e42013-11-22 17:38:12 +0100390.. data:: PurePath.suffix
391
392 The file extension of the final component, if any::
393
394 >>> PurePosixPath('my/library/setup.py').suffix
395 '.py'
396 >>> PurePosixPath('my/library.tar.gz').suffix
397 '.gz'
398 >>> PurePosixPath('my/library').suffix
399 ''
400
401
402.. data:: PurePath.suffixes
403
404 A list of the path's file extensions::
405
406 >>> PurePosixPath('my/library.tar.gar').suffixes
407 ['.tar', '.gar']
408 >>> PurePosixPath('my/library.tar.gz').suffixes
409 ['.tar', '.gz']
410 >>> PurePosixPath('my/library').suffixes
411 []
412
413
414.. data:: PurePath.stem
415
416 The final path component, without its suffix::
417
418 >>> PurePosixPath('my/library.tar.gz').stem
419 'library.tar'
420 >>> PurePosixPath('my/library.tar').stem
421 'library'
422 >>> PurePosixPath('my/library').stem
423 'library'
424
425
426.. method:: PurePath.as_posix()
427
428 Return a string representation of the path with forward slashes (``/``)::
429
430 >>> p = PureWindowsPath('c:\\windows')
431 >>> str(p)
432 'c:\\windows'
433 >>> p.as_posix()
434 'c:/windows'
435
436
437.. method:: PurePath.as_uri()
438
439 Represent the path as a ``file`` URI. :exc:`ValueError` is raised if
440 the path isn't absolute.
441
442 >>> p = PurePosixPath('/etc/passwd')
443 >>> p.as_uri()
444 'file:///etc/passwd'
445 >>> p = PureWindowsPath('c:/Windows')
446 >>> p.as_uri()
447 'file:///c:/Windows'
448
449
450.. method:: PurePath.is_absolute()
451
452 Return whether the path is absolute or not. A path is considered absolute
453 if it has both a root and (if the flavour allows) a drive::
454
455 >>> PurePosixPath('/a/b').is_absolute()
456 True
457 >>> PurePosixPath('a/b').is_absolute()
458 False
459
460 >>> PureWindowsPath('c:/a/b').is_absolute()
461 True
462 >>> PureWindowsPath('/a/b').is_absolute()
463 False
464 >>> PureWindowsPath('c:').is_absolute()
465 False
466 >>> PureWindowsPath('//some/share').is_absolute()
467 True
468
469
470.. method:: PurePath.is_reserved()
471
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200472 With :class:`PureWindowsPath`, return ``True`` if the path is considered
473 reserved under Windows, ``False`` otherwise. With :class:`PurePosixPath`,
474 ``False`` is always returned.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100475
476 >>> PureWindowsPath('nul').is_reserved()
477 True
478 >>> PurePosixPath('nul').is_reserved()
479 False
480
481 File system calls on reserved paths can fail mysteriously or have
482 unintended effects.
483
484
485.. method:: PurePath.joinpath(*other)
486
Andrew Kuchling7a4e2d12013-11-22 15:45:02 -0500487 Calling this method is equivalent to combining the path with each of
Antoine Pitrou31119e42013-11-22 17:38:12 +0100488 the *other* arguments in turn::
489
490 >>> PurePosixPath('/etc').joinpath('passwd')
491 PurePosixPath('/etc/passwd')
492 >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
493 PurePosixPath('/etc/passwd')
494 >>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
495 PurePosixPath('/etc/init.d/apache2')
496 >>> PureWindowsPath('c:').joinpath('/Program Files')
497 PureWindowsPath('c:/Program Files')
498
499
500.. method:: PurePath.match(pattern)
501
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200502 Match this path against the provided glob-style pattern. Return ``True``
503 if matching is successful, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100504
505 If *pattern* is relative, the path can be either relative or absolute,
506 and matching is done from the right::
507
508 >>> PurePath('a/b.py').match('*.py')
509 True
510 >>> PurePath('/a/b/c.py').match('b/*.py')
511 True
512 >>> PurePath('/a/b/c.py').match('a/*.py')
513 False
514
515 If *pattern* is absolute, the path must be absolute, and the whole path
516 must match::
517
518 >>> PurePath('/a.py').match('/*.py')
519 True
520 >>> PurePath('a/b.py').match('/*.py')
521 False
522
523 As with other methods, case-sensitivity is observed::
524
525 >>> PureWindowsPath('b.py').match('*.PY')
526 True
527
528
529.. method:: PurePath.relative_to(*other)
530
531 Compute a version of this path relative to the path represented by
532 *other*. If it's impossible, ValueError is raised::
533
534 >>> p = PurePosixPath('/etc/passwd')
535 >>> p.relative_to('/')
536 PurePosixPath('etc/passwd')
537 >>> p.relative_to('/etc')
538 PurePosixPath('passwd')
539 >>> p.relative_to('/usr')
540 Traceback (most recent call last):
541 File "<stdin>", line 1, in <module>
542 File "pathlib.py", line 694, in relative_to
543 .format(str(self), str(formatted)))
544 ValueError: '/etc/passwd' does not start with '/usr'
545
546
Antoine Pitrouef851192014-02-25 20:33:02 +0100547.. method:: PurePath.with_name(name)
548
549 Return a new path with the :attr:`name` changed. If the original path
550 doesn't have a name, ValueError is raised::
551
552 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
553 >>> p.with_name('setup.py')
554 PureWindowsPath('c:/Downloads/setup.py')
555 >>> p = PureWindowsPath('c:/')
556 >>> p.with_name('setup.py')
557 Traceback (most recent call last):
558 File "<stdin>", line 1, in <module>
559 File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
560 raise ValueError("%r has an empty name" % (self,))
561 ValueError: PureWindowsPath('c:/') has an empty name
562
563
564.. method:: PurePath.with_suffix(suffix)
565
566 Return a new path with the :attr:`suffix` changed. If the original path
567 doesn't have a suffix, the new *suffix* is appended instead::
568
569 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
570 >>> p.with_suffix('.bz2')
571 PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
572 >>> p = PureWindowsPath('README')
573 >>> p.with_suffix('.txt')
574 PureWindowsPath('README.txt')
575
576
Antoine Pitrou31119e42013-11-22 17:38:12 +0100577.. _concrete-paths:
578
579
580Concrete paths
581--------------
582
583Concrete paths are subclasses of the pure path classes. In addition to
584operations provided by the latter, they also provide methods to do system
585calls on path objects. There are three ways to instantiate concrete paths:
586
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800587.. class:: Path(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100588
589 A subclass of :class:`PurePath`, this class represents concrete paths of
590 the system's path flavour (instantiating it creates either a
591 :class:`PosixPath` or a :class:`WindowsPath`)::
592
593 >>> Path('setup.py')
594 PosixPath('setup.py')
595
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800596 *pathsegments* is specified similarly to :class:`PurePath`.
597
598.. class:: PosixPath(*pathsegments)
599
600 A subclass of :class:`Path` and :class:`PurePosixPath`, this class
601 represents concrete non-Windows filesystem paths::
602
603 >>> PosixPath('/etc')
604 PosixPath('/etc')
605
606 *pathsegments* is specified similarly to :class:`PurePath`.
607
608.. class:: WindowsPath(*pathsegments)
609
610 A subclass of :class:`Path` and :class:`PureWindowsPath`, this class
611 represents concrete Windows filesystem paths::
612
613 >>> WindowsPath('c:/Program Files/')
614 WindowsPath('c:/Program Files')
615
616 *pathsegments* is specified similarly to :class:`PurePath`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100617
618You can only instantiate the class flavour that corresponds to your system
619(allowing system calls on non-compatible path flavours could lead to
620bugs or failures in your application)::
621
622 >>> import os
623 >>> os.name
624 'posix'
625 >>> Path('setup.py')
626 PosixPath('setup.py')
627 >>> PosixPath('setup.py')
628 PosixPath('setup.py')
629 >>> WindowsPath('setup.py')
630 Traceback (most recent call last):
631 File "<stdin>", line 1, in <module>
632 File "pathlib.py", line 798, in __new__
633 % (cls.__name__,))
634 NotImplementedError: cannot instantiate 'WindowsPath' on your system
635
636
637Methods
638^^^^^^^
639
640Concrete paths provide the following methods in addition to pure paths
641methods. Many of these methods can raise an :exc:`OSError` if a system
642call fails (for example because the path doesn't exist):
643
644.. classmethod:: Path.cwd()
645
646 Return a new path object representing the current directory (as returned
647 by :func:`os.getcwd`)::
648
649 >>> Path.cwd()
650 PosixPath('/home/antoine/pathlib')
651
652
Antoine Pitrou17cba7d2015-01-12 21:03:41 +0100653.. classmethod:: Path.home()
654
655 Return a new path object representing the user's home directory (as
656 returned by :func:`os.path.expanduser` with ``~`` construct)::
657
658 >>> Path.home()
659 PosixPath('/home/antoine')
660
661 .. versionadded:: 3.5
662
663
Antoine Pitrou31119e42013-11-22 17:38:12 +0100664.. method:: Path.stat()
665
666 Return information about this path (similarly to :func:`os.stat`).
667 The result is looked up at each call to this method.
668
669 >>> p = Path('setup.py')
670 >>> p.stat().st_size
671 956
672 >>> p.stat().st_mtime
673 1327883547.852554
674
675
676.. method:: Path.chmod(mode)
677
678 Change the file mode and permissions, like :func:`os.chmod`::
679
680 >>> p = Path('setup.py')
681 >>> p.stat().st_mode
682 33277
683 >>> p.chmod(0o444)
684 >>> p.stat().st_mode
685 33060
686
687
688.. method:: Path.exists()
689
690 Whether the path points to an existing file or directory::
691
692 >>> Path('.').exists()
693 True
694 >>> Path('setup.py').exists()
695 True
696 >>> Path('/etc').exists()
697 True
698 >>> Path('nonexistentfile').exists()
699 False
700
701 .. note::
702 If the path points to a symlink, :meth:`exists` returns whether the
703 symlink *points to* an existing file or directory.
704
705
Antoine Pitrou8477ed62014-12-30 20:54:45 +0100706.. method:: Path.expanduser()
707
708 Return a new path with expanded ``~`` and ``~user`` constructs,
709 as returned by :meth:`os.path.expanduser`::
710
711 >>> p = PosixPath('~/films/Monty Python')
712 >>> p.expanduser()
713 PosixPath('/home/eric/films/Monty Python')
714
715 .. versionadded:: 3.5
716
717
Antoine Pitrou31119e42013-11-22 17:38:12 +0100718.. method:: Path.glob(pattern)
719
720 Glob the given *pattern* in the directory represented by this path,
721 yielding all matching files (of any kind)::
722
723 >>> sorted(Path('.').glob('*.py'))
724 [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
725 >>> sorted(Path('.').glob('*/*.py'))
726 [PosixPath('docs/conf.py')]
727
728 The "``**``" pattern means "this directory and all subdirectories,
729 recursively". In other words, it enables recursive globbing::
730
731 >>> sorted(Path('.').glob('**/*.py'))
732 [PosixPath('build/lib/pathlib.py'),
733 PosixPath('docs/conf.py'),
734 PosixPath('pathlib.py'),
735 PosixPath('setup.py'),
736 PosixPath('test_pathlib.py')]
737
738 .. note::
739 Using the "``**``" pattern in large directory trees may consume
740 an inordinate amount of time.
741
742
743.. method:: Path.group()
744
Ned Deilyc0341562013-11-27 14:42:55 -0800745 Return the name of the group owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100746 if the file's gid isn't found in the system database.
747
748
749.. method:: Path.is_dir()
750
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200751 Return ``True`` if the path points to a directory (or a symbolic link
752 pointing to a directory), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100753
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200754 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100755 other errors (such as permission errors) are propagated.
756
757
758.. method:: Path.is_file()
759
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200760 Return ``True`` if the path points to a regular file (or a symbolic link
761 pointing to a regular file), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100762
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200763 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100764 other errors (such as permission errors) are propagated.
765
766
767.. method:: Path.is_symlink()
768
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200769 Return ``True`` if the path points to a symbolic link, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100770
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200771 ``False`` is also returned if the path doesn't exist; other errors (such
Antoine Pitrou31119e42013-11-22 17:38:12 +0100772 as permission errors) are propagated.
773
774
775.. method:: Path.is_socket()
776
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200777 Return ``True`` if the path points to a Unix socket (or a symbolic link
778 pointing to a Unix socket), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100779
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200780 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100781 other errors (such as permission errors) are propagated.
782
783
784.. method:: Path.is_fifo()
785
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200786 Return ``True`` if the path points to a FIFO (or a symbolic link
787 pointing to a FIFO), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100788
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200789 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100790 other errors (such as permission errors) are propagated.
791
792
793.. method:: Path.is_block_device()
794
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200795 Return ``True`` if the path points to a block device (or a symbolic link
796 pointing to a block device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100797
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200798 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100799 other errors (such as permission errors) are propagated.
800
801
802.. method:: Path.is_char_device()
803
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200804 Return ``True`` if the path points to a character device (or a symbolic link
805 pointing to a character device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100806
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200807 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100808 other errors (such as permission errors) are propagated.
809
810
811.. method:: Path.iterdir()
812
813 When the path points to a directory, yield path objects of the directory
814 contents::
815
816 >>> p = Path('docs')
817 >>> for child in p.iterdir(): child
818 ...
819 PosixPath('docs/conf.py')
820 PosixPath('docs/_templates')
821 PosixPath('docs/make.bat')
822 PosixPath('docs/index.rst')
823 PosixPath('docs/_build')
824 PosixPath('docs/_static')
825 PosixPath('docs/Makefile')
826
827.. method:: Path.lchmod(mode)
828
829 Like :meth:`Path.chmod` but, if the path points to a symbolic link, the
830 symbolic link's mode is changed rather than its target's.
831
832
833.. method:: Path.lstat()
834
835 Like :meth:`Path.stat` but, if the path points to a symbolic link, return
836 the symbolic link's information rather than its target's.
837
838
Barry Warsaw7c549c42014-08-05 11:28:12 -0400839.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100840
841 Create a new directory at this given path. If *mode* is given, it is
842 combined with the process' ``umask`` value to determine the file mode
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100843 and access flags. If the path already exists, :exc:`FileExistsError`
844 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100845
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200846 If *parents* is true, any missing parents of this path are created
Antoine Pitrou0048c982013-12-16 20:22:37 +0100847 as needed; they are created with the default permissions without taking
848 *mode* into account (mimicking the POSIX ``mkdir -p`` command).
849
850 If *parents* is false (the default), a missing parent raises
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100851 :exc:`FileNotFoundError`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100852
Barry Warsaw7c549c42014-08-05 11:28:12 -0400853 If *exist_ok* is false (the default), an :exc:`FileExistsError` is
854 raised if the target directory already exists.
855
856 If *exist_ok* is true, :exc:`FileExistsError` exceptions will be
857 ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the
858 last path component is not an existing non-directory file.
859
860 .. versionchanged:: 3.5
861 The *exist_ok* parameter was added.
862
Antoine Pitrou31119e42013-11-22 17:38:12 +0100863
864.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
865
866 Open the file pointed to by the path, like the built-in :func:`open`
867 function does::
868
869 >>> p = Path('setup.py')
870 >>> with p.open() as f:
871 ... f.readline()
872 ...
873 '#!/usr/bin/env python3\n'
874
875
876.. method:: Path.owner()
877
Ned Deilyc0341562013-11-27 14:42:55 -0800878 Return the name of the user owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100879 if the file's uid isn't found in the system database.
880
881
Georg Brandlea683982014-10-01 19:12:33 +0200882.. method:: Path.read_bytes()
883
884 Return the binary contents of the pointed-to file as a bytes object::
885
886 >>> p = Path('my_binary_file')
887 >>> p.write_bytes(b'Binary file contents')
888 20
889 >>> p.read_bytes()
890 b'Binary file contents'
891
892 .. versionadded:: 3.5
893
894
895.. method:: Path.read_text(encoding=None, errors=None)
896
897 Return the decoded contents of the pointed-to file as a string::
898
899 >>> p = Path('my_text_file')
900 >>> p.write_text('Text file contents')
901 18
902 >>> p.read_text()
903 'Text file contents'
904
905 The optional parameters have the same meaning as in :func:`open`.
906
907 .. versionadded:: 3.5
908
909
Antoine Pitrou31119e42013-11-22 17:38:12 +0100910.. method:: Path.rename(target)
911
912 Rename this file or directory to the given *target*. *target* can be
913 either a string or another path object::
914
915 >>> p = Path('foo')
916 >>> p.open('w').write('some text')
917 9
918 >>> target = Path('bar')
919 >>> p.rename(target)
920 >>> target.open().read()
921 'some text'
922
923
924.. method:: Path.replace(target)
925
926 Rename this file or directory to the given *target*. If *target* points
927 to an existing file or directory, it will be unconditionally replaced.
928
929
930.. method:: Path.resolve()
931
932 Make the path absolute, resolving any symlinks. A new path object is
933 returned::
934
935 >>> p = Path()
936 >>> p
937 PosixPath('.')
938 >>> p.resolve()
939 PosixPath('/home/antoine/pathlib')
940
941 `".."` components are also eliminated (this is the only method to do so)::
942
943 >>> p = Path('docs/../setup.py')
944 >>> p.resolve()
945 PosixPath('/home/antoine/pathlib/setup.py')
946
947 If the path doesn't exist, :exc:`FileNotFoundError` is raised. If an
948 infinite loop is encountered along the resolution path,
949 :exc:`RuntimeError` is raised.
950
951
952.. method:: Path.rglob(pattern)
953
954 This is like calling :meth:`glob` with "``**``" added in front of the
955 given *pattern*:
956
957 >>> sorted(Path().rglob("*.py"))
958 [PosixPath('build/lib/pathlib.py'),
959 PosixPath('docs/conf.py'),
960 PosixPath('pathlib.py'),
961 PosixPath('setup.py'),
962 PosixPath('test_pathlib.py')]
963
964
965.. method:: Path.rmdir()
966
967 Remove this directory. The directory must be empty.
968
969
Antoine Pitrou43e3d942014-05-13 10:50:15 +0200970.. method:: Path.samefile(other_path)
971
972 Return whether this path points to the same file as *other_path*, which
973 can be either a Path object, or a string. The semantics are similar
974 to :func:`os.path.samefile` and :func:`os.path.samestat`.
975
976 An :exc:`OSError` can be raised if either file cannot be accessed for some
977 reason.
978
979 >>> p = Path('spam')
980 >>> q = Path('eggs')
981 >>> p.samefile(q)
982 False
983 >>> p.samefile('spam')
984 True
985
986 .. versionadded:: 3.5
987
988
Antoine Pitrou31119e42013-11-22 17:38:12 +0100989.. method:: Path.symlink_to(target, target_is_directory=False)
990
991 Make this path a symbolic link to *target*. Under Windows,
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200992 *target_is_directory* must be true (default ``False``) if the link's target
Antoine Pitrou31119e42013-11-22 17:38:12 +0100993 is a directory. Under POSIX, *target_is_directory*'s value is ignored.
994
995 >>> p = Path('mylink')
996 >>> p.symlink_to('setup.py')
997 >>> p.resolve()
998 PosixPath('/home/antoine/pathlib/setup.py')
999 >>> p.stat().st_size
1000 956
1001 >>> p.lstat().st_size
1002 8
1003
1004 .. note::
1005 The order of arguments (link, target) is the reverse
1006 of :func:`os.symlink`'s.
1007
1008
1009.. method:: Path.touch(mode=0o777, exist_ok=True)
1010
1011 Create a file at this given path. If *mode* is given, it is combined
1012 with the process' ``umask`` value to determine the file mode and access
1013 flags. If the file already exists, the function succeeds if *exist_ok*
1014 is true (and its modification time is updated to the current time),
Antoine Pitrouf6abb702013-12-16 21:00:53 +01001015 otherwise :exc:`FileExistsError` is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001016
1017
1018.. method:: Path.unlink()
1019
1020 Remove this file or symbolic link. If the path points to a directory,
1021 use :func:`Path.rmdir` instead.
Georg Brandlea683982014-10-01 19:12:33 +02001022
1023
1024.. method:: Path.write_bytes(data)
1025
1026 Open the file pointed to in bytes mode, write *data* to it, and close the
1027 file::
1028
1029 >>> p = Path('my_binary_file')
1030 >>> p.write_bytes(b'Binary file contents')
1031 20
1032 >>> p.read_bytes()
1033 b'Binary file contents'
1034
1035 An existing file of the same name is overwritten.
1036
1037 .. versionadded:: 3.5
1038
1039
1040.. method:: Path.write_text(data, encoding=None, errors=None)
1041
1042 Open the file pointed to in text mode, write *data* to it, and close the
1043 file::
1044
1045 >>> p = Path('my_text_file')
1046 >>> p.write_text('Text file contents')
1047 18
1048 >>> p.read_text()
1049 'Text file contents'
1050
Georg Brandlea683982014-10-01 19:12:33 +02001051 .. versionadded:: 3.5