blob: f15fed3f02a044a94e450de196f1c7a841cada8d [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
Hai Shi82642a02019-08-13 14:54:02 -0500276 from pathlib import PurePath, PurePosixPath, PureWindowsPath
Marco Buttu7b2491a2017-04-13 16:17:59 +0200277
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
Joshua Cannon45205842020-11-20 09:40:39 -0600339 .. versionchanged:: 3.10
Yaroslav Pankovych79d2e622020-11-23 22:06:22 +0200340 The parents sequence now supports :term:`slices <slice>` and negative index values.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100341
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
Hai Shi82642a02019-08-13 14:54:02 -0500467.. 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
Antoine Pitrou31119e42013-11-22 17:38:12 +0100480.. method:: PurePath.is_reserved()
481
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200482 With :class:`PureWindowsPath`, return ``True`` if the path is considered
483 reserved under Windows, ``False`` otherwise. With :class:`PurePosixPath`,
484 ``False`` is always returned.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100485
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
Andrew Kuchling7a4e2d12013-11-22 15:45:02 -0500497 Calling this method is equivalent to combining the path with each of
Antoine Pitrou31119e42013-11-22 17:38:12 +0100498 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
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200512 Match this path against the provided glob-style pattern. Return ``True``
513 if matching is successful, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100514
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
Tim Loc12375a2020-04-19 05:43:11 -0400533 As with other methods, case-sensitivity follows platform defaults::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100534
Tim Loc12375a2020-04-19 05:43:11 -0400535 >>> PurePosixPath('b.py').match('*.PY')
536 False
Antoine Pitrou31119e42013-11-22 17:38:12 +0100537 >>> 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)))
Rotuna44832532020-05-25 21:42:28 +0200556 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.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100559
560
Antoine Pitrouef851192014-02-25 20:33:02 +0100561.. 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
Tim Hoffmann8aea4b32020-04-19 17:29:49 +0200578.. 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
Antoine Pitrouef851192014-02-25 20:33:02 +0100602.. method:: PurePath.with_suffix(suffix)
603
604 Return a new path with the :attr:`suffix` changed. If the original path
Stefan Otte46dc4e32018-08-03 22:49:42 +0200605 doesn't have a suffix, the new *suffix* is appended instead. If the
606 *suffix* is an empty string, the original suffix is removed::
Antoine Pitrouef851192014-02-25 20:33:02 +0100607
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')
Stefan Otte46dc4e32018-08-03 22:49:42 +0200614 >>> p = PureWindowsPath('README.txt')
615 >>> p.with_suffix('')
616 PureWindowsPath('README')
Antoine Pitrouef851192014-02-25 20:33:02 +0100617
618
Antoine Pitrou31119e42013-11-22 17:38:12 +0100619.. _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
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800629.. class:: Path(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100630
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
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800638 *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`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100659
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
Serhiy Storchaka0185f342018-09-18 11:28:51 +0300684call 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
Antoine Pitrou31119e42013-11-22 17:38:12 +0100695
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
Antoine Pitrou17cba7d2015-01-12 21:03:41 +0100705.. classmethod:: Path.home()
706
707 Return a new path object representing the user's home directory (as
Barney Gale3f3d82b2021-04-07 23:50:13 +0100708 returned by :func:`os.path.expanduser` with ``~`` construct). If the home
709 directory can't be resolved, :exc:`RuntimeError` is raised.
710
711 ::
Antoine Pitrou17cba7d2015-01-12 21:03:41 +0100712
713 >>> Path.home()
714 PosixPath('/home/antoine')
715
716 .. versionadded:: 3.5
717
718
Barney Galeabf96492021-04-07 16:53:39 +0100719.. method:: Path.stat(*, follow_symlinks=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100720
Brett Cannon67152d02020-03-04 14:51:50 -0800721 Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100722 The result is looked up at each call to this method.
723
Barney Galeabf96492021-04-07 16:53:39 +0100724 This method normally follows symlinks; to stat a symlink add the argument
725 ``follow_symlinks=False``, or use :meth:`~Path.lstat`.
726
Marco Buttu7b2491a2017-04-13 16:17:59 +0200727 ::
728
Antoine Pitrou31119e42013-11-22 17:38:12 +0100729 >>> p = Path('setup.py')
730 >>> p.stat().st_size
731 956
732 >>> p.stat().st_mtime
733 1327883547.852554
734
Barney Galeabf96492021-04-07 16:53:39 +0100735 .. versionchanged:: 3.10
736 The *follow_symlinks* parameter was added.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100737
Barney Galeabf96492021-04-07 16:53:39 +0100738.. method:: Path.chmod(mode, *, follow_symlinks=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100739
Barney Galeabf96492021-04-07 16:53:39 +0100740 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 ::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100747
748 >>> p = Path('setup.py')
749 >>> p.stat().st_mode
750 33277
751 >>> p.chmod(0o444)
752 >>> p.stat().st_mode
753 33060
754
Barney Galeabf96492021-04-07 16:53:39 +0100755 .. versionchanged:: 3.10
756 The *follow_symlinks* parameter was added.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100757
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
Antoine Pitrou8477ed62014-12-30 20:54:45 +0100776.. method:: Path.expanduser()
777
778 Return a new path with expanded ``~`` and ``~user`` constructs,
Barney Gale3f3d82b2021-04-07 23:50:13 +0100779 as returned by :meth:`os.path.expanduser`. If a home directory can't be
780 resolved, :exc:`RuntimeError` is raised.
781
782 ::
Antoine Pitrou8477ed62014-12-30 20:54:45 +0100783
784 >>> p = PosixPath('~/films/Monty Python')
785 >>> p.expanduser()
786 PosixPath('/home/eric/films/Monty Python')
787
788 .. versionadded:: 3.5
789
790
Antoine Pitrou31119e42013-11-22 17:38:12 +0100791.. method:: Path.glob(pattern)
792
Eivind Teig537b6ca2019-02-11 11:47:09 +0100793 Glob the given relative *pattern* in the directory represented by this path,
Antoine Pitrou31119e42013-11-22 17:38:12 +0100794 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 The "``**``" pattern means "this directory and all subdirectories,
802 recursively". In other words, it enables recursive globbing::
803
804 >>> sorted(Path('.').glob('**/*.py'))
805 [PosixPath('build/lib/pathlib.py'),
806 PosixPath('docs/conf.py'),
807 PosixPath('pathlib.py'),
808 PosixPath('setup.py'),
809 PosixPath('test_pathlib.py')]
810
811 .. note::
812 Using the "``**``" pattern in large directory trees may consume
813 an inordinate amount of time.
814
Serhiy Storchakadb283b32020-03-08 14:31:47 +0200815 .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob
816
Antoine Pitrou31119e42013-11-22 17:38:12 +0100817
818.. method:: Path.group()
819
Ned Deilyc0341562013-11-27 14:42:55 -0800820 Return the name of the group owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100821 if the file's gid isn't found in the system database.
822
823
824.. method:: Path.is_dir()
825
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200826 Return ``True`` if the path points to a directory (or a symbolic link
827 pointing to a directory), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100828
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200829 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100830 other errors (such as permission errors) are propagated.
831
832
833.. method:: Path.is_file()
834
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200835 Return ``True`` if the path points to a regular file (or a symbolic link
836 pointing to a regular file), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100837
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200838 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100839 other errors (such as permission errors) are propagated.
840
841
Łukasz Langa47320a62017-08-01 16:47:50 -0700842.. method:: Path.is_mount()
843
844 Return ``True`` if the path is a :dfn:`mount point`: a point in a
845 file system where a different file system has been mounted. On POSIX, the
846 function checks whether *path*'s parent, :file:`path/..`, is on a different
847 device than *path*, or whether :file:`path/..` and *path* point to the same
848 i-node on the same device --- this should detect mount points for all Unix
849 and POSIX variants. Not implemented on Windows.
850
851 .. versionadded:: 3.7
852
853
Antoine Pitrou31119e42013-11-22 17:38:12 +0100854.. method:: Path.is_symlink()
855
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200856 Return ``True`` if the path points to a symbolic link, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100857
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200858 ``False`` is also returned if the path doesn't exist; other errors (such
Antoine Pitrou31119e42013-11-22 17:38:12 +0100859 as permission errors) are propagated.
860
861
862.. method:: Path.is_socket()
863
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200864 Return ``True`` if the path points to a Unix socket (or a symbolic link
865 pointing to a Unix socket), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100866
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200867 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100868 other errors (such as permission errors) are propagated.
869
870
871.. method:: Path.is_fifo()
872
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200873 Return ``True`` if the path points to a FIFO (or a symbolic link
874 pointing to a FIFO), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100875
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200876 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100877 other errors (such as permission errors) are propagated.
878
879
880.. method:: Path.is_block_device()
881
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200882 Return ``True`` if the path points to a block device (or a symbolic link
883 pointing to a block device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100884
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200885 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100886 other errors (such as permission errors) are propagated.
887
888
889.. method:: Path.is_char_device()
890
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200891 Return ``True`` if the path points to a character device (or a symbolic link
892 pointing to a character device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100893
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200894 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100895 other errors (such as permission errors) are propagated.
896
897
898.. method:: Path.iterdir()
899
900 When the path points to a directory, yield path objects of the directory
901 contents::
902
903 >>> p = Path('docs')
904 >>> for child in p.iterdir(): child
905 ...
906 PosixPath('docs/conf.py')
907 PosixPath('docs/_templates')
908 PosixPath('docs/make.bat')
909 PosixPath('docs/index.rst')
910 PosixPath('docs/_build')
911 PosixPath('docs/_static')
912 PosixPath('docs/Makefile')
913
Serhiy Storchaka306cfb32020-09-04 21:19:30 +0300914 The children are yielded in arbitrary order, and the special entries
915 ``'.'`` and ``'..'`` are not included. If a file is removed from or added
916 to the directory after creating the iterator, whether an path object for
917 that file be included is unspecified.
918
Antoine Pitrou31119e42013-11-22 17:38:12 +0100919.. method:: Path.lchmod(mode)
920
921 Like :meth:`Path.chmod` but, if the path points to a symbolic link, the
922 symbolic link's mode is changed rather than its target's.
923
924
925.. method:: Path.lstat()
926
927 Like :meth:`Path.stat` but, if the path points to a symbolic link, return
928 the symbolic link's information rather than its target's.
929
930
Barry Warsaw7c549c42014-08-05 11:28:12 -0400931.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100932
933 Create a new directory at this given path. If *mode* is given, it is
934 combined with the process' ``umask`` value to determine the file mode
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100935 and access flags. If the path already exists, :exc:`FileExistsError`
936 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100937
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200938 If *parents* is true, any missing parents of this path are created
Antoine Pitrou0048c982013-12-16 20:22:37 +0100939 as needed; they are created with the default permissions without taking
940 *mode* into account (mimicking the POSIX ``mkdir -p`` command).
941
942 If *parents* is false (the default), a missing parent raises
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100943 :exc:`FileNotFoundError`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100944
Ned Deily11194f72016-10-15 15:12:03 -0400945 If *exist_ok* is false (the default), :exc:`FileExistsError` is
Barry Warsaw7c549c42014-08-05 11:28:12 -0400946 raised if the target directory already exists.
947
948 If *exist_ok* is true, :exc:`FileExistsError` exceptions will be
949 ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the
950 last path component is not an existing non-directory file.
951
952 .. versionchanged:: 3.5
953 The *exist_ok* parameter was added.
954
Antoine Pitrou31119e42013-11-22 17:38:12 +0100955
956.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
957
958 Open the file pointed to by the path, like the built-in :func:`open`
959 function does::
960
961 >>> p = Path('setup.py')
962 >>> with p.open() as f:
963 ... f.readline()
964 ...
965 '#!/usr/bin/env python3\n'
966
967
968.. method:: Path.owner()
969
Ned Deilyc0341562013-11-27 14:42:55 -0800970 Return the name of the user owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100971 if the file's uid isn't found in the system database.
972
973
Georg Brandlea683982014-10-01 19:12:33 +0200974.. method:: Path.read_bytes()
975
976 Return the binary contents of the pointed-to file as a bytes object::
977
978 >>> p = Path('my_binary_file')
979 >>> p.write_bytes(b'Binary file contents')
980 20
981 >>> p.read_bytes()
982 b'Binary file contents'
983
984 .. versionadded:: 3.5
985
986
987.. method:: Path.read_text(encoding=None, errors=None)
988
989 Return the decoded contents of the pointed-to file as a string::
990
991 >>> p = Path('my_text_file')
992 >>> p.write_text('Text file contents')
993 18
994 >>> p.read_text()
995 'Text file contents'
996
Xtreak5b2657f2018-08-07 01:25:03 +0530997 The file is opened and then closed. The optional parameters have the same
998 meaning as in :func:`open`.
Georg Brandlea683982014-10-01 19:12:33 +0200999
1000 .. versionadded:: 3.5
1001
1002
Girtsa01ba332019-10-23 14:18:40 -07001003.. method:: Path.readlink()
1004
1005 Return the path to which the symbolic link points (as returned by
1006 :func:`os.readlink`)::
1007
1008 >>> p = Path('mylink')
1009 >>> p.symlink_to('setup.py')
1010 >>> p.readlink()
1011 PosixPath('setup.py')
1012
1013 .. versionadded:: 3.9
1014
1015
Antoine Pitrou31119e42013-11-22 17:38:12 +01001016.. method:: Path.rename(target)
1017
hui shang088a09a2019-09-11 21:26:49 +08001018 Rename this file or directory to the given *target*, and return a new Path
1019 instance pointing to *target*. On Unix, if *target* exists and is a file,
1020 it will be replaced silently if the user has permission. *target* can be
1021 either a string or another path object::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001022
1023 >>> p = Path('foo')
1024 >>> p.open('w').write('some text')
1025 9
1026 >>> target = Path('bar')
1027 >>> p.rename(target)
hui shang088a09a2019-09-11 21:26:49 +08001028 PosixPath('bar')
Antoine Pitrou31119e42013-11-22 17:38:12 +01001029 >>> target.open().read()
1030 'some text'
1031
Ram Rachumf97e42e2020-10-03 12:52:13 +03001032 The target path may be absolute or relative. Relative paths are interpreted
1033 relative to the current working directory, *not* the directory of the Path
1034 object.
1035
hui shang088a09a2019-09-11 21:26:49 +08001036 .. versionchanged:: 3.8
1037 Added return value, return the new Path instance.
1038
Antoine Pitrou31119e42013-11-22 17:38:12 +01001039
1040.. method:: Path.replace(target)
1041
hui shang088a09a2019-09-11 21:26:49 +08001042 Rename this file or directory to the given *target*, and return a new Path
1043 instance pointing to *target*. If *target* points to an existing file or
1044 directory, it will be unconditionally replaced.
1045
Ram Rachumf97e42e2020-10-03 12:52:13 +03001046 The target path may be absolute or relative. Relative paths are interpreted
1047 relative to the current working directory, *not* the directory of the Path
1048 object.
1049
hui shang088a09a2019-09-11 21:26:49 +08001050 .. versionchanged:: 3.8
1051 Added return value, return the new Path instance.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001052
1053
Steve Dower98eb3602016-11-09 12:58:17 -08001054.. method:: Path.resolve(strict=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001055
1056 Make the path absolute, resolving any symlinks. A new path object is
1057 returned::
1058
1059 >>> p = Path()
1060 >>> p
1061 PosixPath('.')
1062 >>> p.resolve()
1063 PosixPath('/home/antoine/pathlib')
1064
Berker Peksag5e3677d2016-10-01 01:06:52 +03001065 "``..``" components are also eliminated (this is the only method to do so)::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001066
1067 >>> p = Path('docs/../setup.py')
1068 >>> p.resolve()
1069 PosixPath('/home/antoine/pathlib/setup.py')
1070
Steve Dower98eb3602016-11-09 12:58:17 -08001071 If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError`
1072 is raised. If *strict* is ``False``, the path is resolved as far as possible
1073 and any remainder is appended without checking whether it exists. If an
1074 infinite loop is encountered along the resolution path, :exc:`RuntimeError`
1075 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001076
Steve Dower98eb3602016-11-09 12:58:17 -08001077 .. versionadded:: 3.6
Julien Palard1d4b1602019-05-08 17:01:11 +02001078 The *strict* argument (pre-3.6 behavior is strict).
Antoine Pitrou31119e42013-11-22 17:38:12 +01001079
1080.. method:: Path.rglob(pattern)
1081
Eivind Teig537b6ca2019-02-11 11:47:09 +01001082 This is like calling :func:`Path.glob` with "``**/``" added in front of the
1083 given relative *pattern*::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001084
1085 >>> sorted(Path().rglob("*.py"))
1086 [PosixPath('build/lib/pathlib.py'),
1087 PosixPath('docs/conf.py'),
1088 PosixPath('pathlib.py'),
1089 PosixPath('setup.py'),
1090 PosixPath('test_pathlib.py')]
1091
Serhiy Storchakadb283b32020-03-08 14:31:47 +02001092 .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob
1093
Antoine Pitrou31119e42013-11-22 17:38:12 +01001094
1095.. method:: Path.rmdir()
1096
1097 Remove this directory. The directory must be empty.
1098
1099
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001100.. method:: Path.samefile(other_path)
1101
1102 Return whether this path points to the same file as *other_path*, which
1103 can be either a Path object, or a string. The semantics are similar
1104 to :func:`os.path.samefile` and :func:`os.path.samestat`.
1105
1106 An :exc:`OSError` can be raised if either file cannot be accessed for some
1107 reason.
1108
Marco Buttu7b2491a2017-04-13 16:17:59 +02001109 ::
1110
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001111 >>> p = Path('spam')
1112 >>> q = Path('eggs')
1113 >>> p.samefile(q)
1114 False
1115 >>> p.samefile('spam')
1116 True
1117
1118 .. versionadded:: 3.5
1119
1120
Antoine Pitrou31119e42013-11-22 17:38:12 +01001121.. method:: Path.symlink_to(target, target_is_directory=False)
1122
1123 Make this path a symbolic link to *target*. Under Windows,
Serhiy Storchaka03cc5652013-11-26 21:37:12 +02001124 *target_is_directory* must be true (default ``False``) if the link's target
Antoine Pitrou31119e42013-11-22 17:38:12 +01001125 is a directory. Under POSIX, *target_is_directory*'s value is ignored.
1126
Marco Buttu7b2491a2017-04-13 16:17:59 +02001127 ::
1128
Antoine Pitrou31119e42013-11-22 17:38:12 +01001129 >>> p = Path('mylink')
1130 >>> p.symlink_to('setup.py')
1131 >>> p.resolve()
1132 PosixPath('/home/antoine/pathlib/setup.py')
1133 >>> p.stat().st_size
1134 956
1135 >>> p.lstat().st_size
1136 8
1137
1138 .. note::
1139 The order of arguments (link, target) is the reverse
1140 of :func:`os.symlink`'s.
1141
1142
Barney Gale8aac1be2021-04-07 16:56:32 +01001143.. method:: Path.link_to(target)
1144
1145 Make *target* a hard link to this path.
1146
1147 .. warning::
1148
1149 This function does not make this path a hard link to *target*, despite
1150 the implication of the function and argument names. The argument order
1151 (target, link) is the reverse of :func:`Path.symlink_to`, but matches
1152 that of :func:`os.link`.
1153
1154 .. versionadded:: 3.8
1155
1156
Zachary Ware7a26da52016-08-09 17:10:39 -05001157.. method:: Path.touch(mode=0o666, exist_ok=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001158
1159 Create a file at this given path. If *mode* is given, it is combined
1160 with the process' ``umask`` value to determine the file mode and access
1161 flags. If the file already exists, the function succeeds if *exist_ok*
1162 is true (and its modification time is updated to the current time),
Antoine Pitrouf6abb702013-12-16 21:00:53 +01001163 otherwise :exc:`FileExistsError` is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001164
1165
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001166.. method:: Path.unlink(missing_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001167
1168 Remove this file or symbolic link. If the path points to a directory,
1169 use :func:`Path.rmdir` instead.
Georg Brandlea683982014-10-01 19:12:33 +02001170
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001171 If *missing_ok* is false (the default), :exc:`FileNotFoundError` is
1172 raised if the path does not exist.
1173
1174 If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be
1175 ignored (same behavior as the POSIX ``rm -f`` command).
1176
1177 .. versionchanged:: 3.8
1178 The *missing_ok* parameter was added.
1179
Georg Brandlea683982014-10-01 19:12:33 +02001180
1181.. method:: Path.write_bytes(data)
1182
1183 Open the file pointed to in bytes mode, write *data* to it, and close the
1184 file::
1185
1186 >>> p = Path('my_binary_file')
1187 >>> p.write_bytes(b'Binary file contents')
1188 20
1189 >>> p.read_bytes()
1190 b'Binary file contents'
1191
1192 An existing file of the same name is overwritten.
1193
1194 .. versionadded:: 3.5
1195
1196
Максим5f227412020-10-21 05:08:19 +03001197.. method:: Path.write_text(data, encoding=None, errors=None, newline=None)
Georg Brandlea683982014-10-01 19:12:33 +02001198
1199 Open the file pointed to in text mode, write *data* to it, and close the
1200 file::
1201
1202 >>> p = Path('my_text_file')
1203 >>> p.write_text('Text file contents')
1204 18
1205 >>> p.read_text()
1206 'Text file contents'
1207
Lysandros Nikolaouaf636f42019-09-11 18:08:10 +03001208 An existing file of the same name is overwritten. The optional parameters
1209 have the same meaning as in :func:`open`.
1210
Georg Brandlea683982014-10-01 19:12:33 +02001211 .. versionadded:: 3.5
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001212
Максим5f227412020-10-21 05:08:19 +03001213 .. versionchanged:: 3.10
1214 The *newline* parameter was added.
1215
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001216Correspondence to tools in the :mod:`os` module
1217-----------------------------------------------
1218
1219Below is a table mapping various :mod:`os` functions to their corresponding
1220:class:`PurePath`/:class:`Path` equivalent.
1221
1222.. note::
1223
Hong Xu1459fed2021-01-20 02:20:00 -08001224 Not all pairs of functions/methods below are equivalent. Some of them,
1225 despite having some overlapping use-cases, have different semantics. They
1226 include :func:`os.path.abspath` and :meth:`Path.resolve`,
1227 :func:`os.path.relpath` and :meth:`PurePath.relative_to`.
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001228
Xtreak6f9c55d2018-10-05 20:54:11 +05301229==================================== ==============================
Hong Xu1459fed2021-01-20 02:20:00 -08001230:mod:`os` and :mod:`os.path` :mod:`pathlib`
Xtreak6f9c55d2018-10-05 20:54:11 +05301231==================================== ==============================
Hong Xu1459fed2021-01-20 02:20:00 -08001232:func:`os.path.abspath` :meth:`Path.resolve` [#]_
Xtreak6f9c55d2018-10-05 20:54:11 +05301233:func:`os.chmod` :meth:`Path.chmod`
1234:func:`os.mkdir` :meth:`Path.mkdir`
Joannah Nanjekyef25fb6e2020-05-04 16:47:03 -03001235:func:`os.makedirs` :meth:`Path.mkdir`
Xtreak6f9c55d2018-10-05 20:54:11 +05301236:func:`os.rename` :meth:`Path.rename`
1237:func:`os.replace` :meth:`Path.replace`
1238:func:`os.rmdir` :meth:`Path.rmdir`
1239:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink`
1240:func:`os.getcwd` :func:`Path.cwd`
1241:func:`os.path.exists` :meth:`Path.exists`
1242:func:`os.path.expanduser` :meth:`Path.expanduser` and
1243 :meth:`Path.home`
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)0eb9deb2020-08-14 01:22:04 +05301244:func:`os.listdir` :meth:`Path.iterdir`
Xtreak6f9c55d2018-10-05 20:54:11 +05301245:func:`os.path.isdir` :meth:`Path.is_dir`
1246:func:`os.path.isfile` :meth:`Path.is_file`
1247:func:`os.path.islink` :meth:`Path.is_symlink`
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)0eb9deb2020-08-14 01:22:04 +05301248:func:`os.link` :meth:`Path.link_to`
1249:func:`os.symlink` :meth:`Path.symlink_to`
Girtsa01ba332019-10-23 14:18:40 -07001250:func:`os.readlink` :meth:`Path.readlink`
Hong Xu1459fed2021-01-20 02:20:00 -08001251:func:`os.path.relpath` :meth:`Path.relative_to` [#]_
Xtreak6f9c55d2018-10-05 20:54:11 +05301252:func:`os.stat` :meth:`Path.stat`,
1253 :meth:`Path.owner`,
1254 :meth:`Path.group`
1255:func:`os.path.isabs` :meth:`PurePath.is_absolute`
1256:func:`os.path.join` :func:`PurePath.joinpath`
1257:func:`os.path.basename` :data:`PurePath.name`
1258:func:`os.path.dirname` :data:`PurePath.parent`
1259:func:`os.path.samefile` :meth:`Path.samefile`
1260:func:`os.path.splitext` :data:`PurePath.suffix`
1261==================================== ==============================
Hong Xu1459fed2021-01-20 02:20:00 -08001262
1263.. rubric:: Footnotes
1264
1265.. [#] :func:`os.path.abspath` does not resolve symbolic links while :meth:`Path.resolve` does.
1266.. [#] :meth:`Path.relative_to` requires ``self`` to be the subpath of the argument, but :func:`os.path.relpath` does not.