blob: b1cfbeda60195489de85d1d319bb4c47582500cf [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
708 returned by :func:`os.path.expanduser` with ``~`` construct)::
709
710 >>> Path.home()
711 PosixPath('/home/antoine')
712
713 .. versionadded:: 3.5
714
715
Barney Galeabf96492021-04-07 16:53:39 +0100716.. method:: Path.stat(*, follow_symlinks=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100717
Brett Cannon67152d02020-03-04 14:51:50 -0800718 Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100719 The result is looked up at each call to this method.
720
Barney Galeabf96492021-04-07 16:53:39 +0100721 This method normally follows symlinks; to stat a symlink add the argument
722 ``follow_symlinks=False``, or use :meth:`~Path.lstat`.
723
Marco Buttu7b2491a2017-04-13 16:17:59 +0200724 ::
725
Antoine Pitrou31119e42013-11-22 17:38:12 +0100726 >>> p = Path('setup.py')
727 >>> p.stat().st_size
728 956
729 >>> p.stat().st_mtime
730 1327883547.852554
731
Barney Galeabf96492021-04-07 16:53:39 +0100732 .. versionchanged:: 3.10
733 The *follow_symlinks* parameter was added.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100734
Barney Galeabf96492021-04-07 16:53:39 +0100735.. method:: Path.chmod(mode, *, follow_symlinks=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100736
Barney Galeabf96492021-04-07 16:53:39 +0100737 Change the file mode and permissions, like :func:`os.chmod`.
738
739 This method normally follows symlinks. Some Unix flavours support changing
740 permissions on the symlink itself; on these platforms you may add the
741 argument ``follow_symlinks=False``, or use :meth:`~Path.lchmod`.
742
743 ::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100744
745 >>> p = Path('setup.py')
746 >>> p.stat().st_mode
747 33277
748 >>> p.chmod(0o444)
749 >>> p.stat().st_mode
750 33060
751
Barney Galeabf96492021-04-07 16:53:39 +0100752 .. versionchanged:: 3.10
753 The *follow_symlinks* parameter was added.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100754
755.. method:: Path.exists()
756
757 Whether the path points to an existing file or directory::
758
759 >>> Path('.').exists()
760 True
761 >>> Path('setup.py').exists()
762 True
763 >>> Path('/etc').exists()
764 True
765 >>> Path('nonexistentfile').exists()
766 False
767
768 .. note::
769 If the path points to a symlink, :meth:`exists` returns whether the
770 symlink *points to* an existing file or directory.
771
772
Antoine Pitrou8477ed62014-12-30 20:54:45 +0100773.. method:: Path.expanduser()
774
775 Return a new path with expanded ``~`` and ``~user`` constructs,
776 as returned by :meth:`os.path.expanduser`::
777
778 >>> p = PosixPath('~/films/Monty Python')
779 >>> p.expanduser()
780 PosixPath('/home/eric/films/Monty Python')
781
782 .. versionadded:: 3.5
783
784
Antoine Pitrou31119e42013-11-22 17:38:12 +0100785.. method:: Path.glob(pattern)
786
Eivind Teig537b6ca2019-02-11 11:47:09 +0100787 Glob the given relative *pattern* in the directory represented by this path,
Antoine Pitrou31119e42013-11-22 17:38:12 +0100788 yielding all matching files (of any kind)::
789
790 >>> sorted(Path('.').glob('*.py'))
791 [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
792 >>> sorted(Path('.').glob('*/*.py'))
793 [PosixPath('docs/conf.py')]
794
795 The "``**``" pattern means "this directory and all subdirectories,
796 recursively". In other words, it enables recursive globbing::
797
798 >>> sorted(Path('.').glob('**/*.py'))
799 [PosixPath('build/lib/pathlib.py'),
800 PosixPath('docs/conf.py'),
801 PosixPath('pathlib.py'),
802 PosixPath('setup.py'),
803 PosixPath('test_pathlib.py')]
804
805 .. note::
806 Using the "``**``" pattern in large directory trees may consume
807 an inordinate amount of time.
808
Serhiy Storchakadb283b32020-03-08 14:31:47 +0200809 .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob
810
Antoine Pitrou31119e42013-11-22 17:38:12 +0100811
812.. method:: Path.group()
813
Ned Deilyc0341562013-11-27 14:42:55 -0800814 Return the name of the group owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100815 if the file's gid isn't found in the system database.
816
817
818.. method:: Path.is_dir()
819
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200820 Return ``True`` if the path points to a directory (or a symbolic link
821 pointing to a directory), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100822
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200823 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100824 other errors (such as permission errors) are propagated.
825
826
827.. method:: Path.is_file()
828
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200829 Return ``True`` if the path points to a regular file (or a symbolic link
830 pointing to a regular file), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100831
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200832 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100833 other errors (such as permission errors) are propagated.
834
835
Łukasz Langa47320a62017-08-01 16:47:50 -0700836.. method:: Path.is_mount()
837
838 Return ``True`` if the path is a :dfn:`mount point`: a point in a
839 file system where a different file system has been mounted. On POSIX, the
840 function checks whether *path*'s parent, :file:`path/..`, is on a different
841 device than *path*, or whether :file:`path/..` and *path* point to the same
842 i-node on the same device --- this should detect mount points for all Unix
843 and POSIX variants. Not implemented on Windows.
844
845 .. versionadded:: 3.7
846
847
Antoine Pitrou31119e42013-11-22 17:38:12 +0100848.. method:: Path.is_symlink()
849
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200850 Return ``True`` if the path points to a symbolic link, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100851
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200852 ``False`` is also returned if the path doesn't exist; other errors (such
Antoine Pitrou31119e42013-11-22 17:38:12 +0100853 as permission errors) are propagated.
854
855
856.. method:: Path.is_socket()
857
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200858 Return ``True`` if the path points to a Unix socket (or a symbolic link
859 pointing to a Unix socket), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100860
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200861 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100862 other errors (such as permission errors) are propagated.
863
864
865.. method:: Path.is_fifo()
866
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200867 Return ``True`` if the path points to a FIFO (or a symbolic link
868 pointing to a FIFO), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100869
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200870 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100871 other errors (such as permission errors) are propagated.
872
873
874.. method:: Path.is_block_device()
875
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200876 Return ``True`` if the path points to a block device (or a symbolic link
877 pointing to a block device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100878
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200879 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100880 other errors (such as permission errors) are propagated.
881
882
883.. method:: Path.is_char_device()
884
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200885 Return ``True`` if the path points to a character device (or a symbolic link
886 pointing to a character device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100887
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200888 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100889 other errors (such as permission errors) are propagated.
890
891
892.. method:: Path.iterdir()
893
894 When the path points to a directory, yield path objects of the directory
895 contents::
896
897 >>> p = Path('docs')
898 >>> for child in p.iterdir(): child
899 ...
900 PosixPath('docs/conf.py')
901 PosixPath('docs/_templates')
902 PosixPath('docs/make.bat')
903 PosixPath('docs/index.rst')
904 PosixPath('docs/_build')
905 PosixPath('docs/_static')
906 PosixPath('docs/Makefile')
907
Serhiy Storchaka306cfb32020-09-04 21:19:30 +0300908 The children are yielded in arbitrary order, and the special entries
909 ``'.'`` and ``'..'`` are not included. If a file is removed from or added
910 to the directory after creating the iterator, whether an path object for
911 that file be included is unspecified.
912
Antoine Pitrou31119e42013-11-22 17:38:12 +0100913.. method:: Path.lchmod(mode)
914
915 Like :meth:`Path.chmod` but, if the path points to a symbolic link, the
916 symbolic link's mode is changed rather than its target's.
917
918
919.. method:: Path.lstat()
920
921 Like :meth:`Path.stat` but, if the path points to a symbolic link, return
922 the symbolic link's information rather than its target's.
923
924
Barry Warsaw7c549c42014-08-05 11:28:12 -0400925.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100926
927 Create a new directory at this given path. If *mode* is given, it is
928 combined with the process' ``umask`` value to determine the file mode
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100929 and access flags. If the path already exists, :exc:`FileExistsError`
930 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100931
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200932 If *parents* is true, any missing parents of this path are created
Antoine Pitrou0048c982013-12-16 20:22:37 +0100933 as needed; they are created with the default permissions without taking
934 *mode* into account (mimicking the POSIX ``mkdir -p`` command).
935
936 If *parents* is false (the default), a missing parent raises
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100937 :exc:`FileNotFoundError`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100938
Ned Deily11194f72016-10-15 15:12:03 -0400939 If *exist_ok* is false (the default), :exc:`FileExistsError` is
Barry Warsaw7c549c42014-08-05 11:28:12 -0400940 raised if the target directory already exists.
941
942 If *exist_ok* is true, :exc:`FileExistsError` exceptions will be
943 ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the
944 last path component is not an existing non-directory file.
945
946 .. versionchanged:: 3.5
947 The *exist_ok* parameter was added.
948
Antoine Pitrou31119e42013-11-22 17:38:12 +0100949
950.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
951
952 Open the file pointed to by the path, like the built-in :func:`open`
953 function does::
954
955 >>> p = Path('setup.py')
956 >>> with p.open() as f:
957 ... f.readline()
958 ...
959 '#!/usr/bin/env python3\n'
960
961
962.. method:: Path.owner()
963
Ned Deilyc0341562013-11-27 14:42:55 -0800964 Return the name of the user owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100965 if the file's uid isn't found in the system database.
966
967
Georg Brandlea683982014-10-01 19:12:33 +0200968.. method:: Path.read_bytes()
969
970 Return the binary contents of the pointed-to file as a bytes object::
971
972 >>> p = Path('my_binary_file')
973 >>> p.write_bytes(b'Binary file contents')
974 20
975 >>> p.read_bytes()
976 b'Binary file contents'
977
978 .. versionadded:: 3.5
979
980
981.. method:: Path.read_text(encoding=None, errors=None)
982
983 Return the decoded contents of the pointed-to file as a string::
984
985 >>> p = Path('my_text_file')
986 >>> p.write_text('Text file contents')
987 18
988 >>> p.read_text()
989 'Text file contents'
990
Xtreak5b2657f2018-08-07 01:25:03 +0530991 The file is opened and then closed. The optional parameters have the same
992 meaning as in :func:`open`.
Georg Brandlea683982014-10-01 19:12:33 +0200993
994 .. versionadded:: 3.5
995
996
Girtsa01ba332019-10-23 14:18:40 -0700997.. method:: Path.readlink()
998
999 Return the path to which the symbolic link points (as returned by
1000 :func:`os.readlink`)::
1001
1002 >>> p = Path('mylink')
1003 >>> p.symlink_to('setup.py')
1004 >>> p.readlink()
1005 PosixPath('setup.py')
1006
1007 .. versionadded:: 3.9
1008
1009
Antoine Pitrou31119e42013-11-22 17:38:12 +01001010.. method:: Path.rename(target)
1011
hui shang088a09a2019-09-11 21:26:49 +08001012 Rename this file or directory to the given *target*, and return a new Path
1013 instance pointing to *target*. On Unix, if *target* exists and is a file,
1014 it will be replaced silently if the user has permission. *target* can be
1015 either a string or another path object::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001016
1017 >>> p = Path('foo')
1018 >>> p.open('w').write('some text')
1019 9
1020 >>> target = Path('bar')
1021 >>> p.rename(target)
hui shang088a09a2019-09-11 21:26:49 +08001022 PosixPath('bar')
Antoine Pitrou31119e42013-11-22 17:38:12 +01001023 >>> target.open().read()
1024 'some text'
1025
Ram Rachumf97e42e2020-10-03 12:52:13 +03001026 The target path may be absolute or relative. Relative paths are interpreted
1027 relative to the current working directory, *not* the directory of the Path
1028 object.
1029
hui shang088a09a2019-09-11 21:26:49 +08001030 .. versionchanged:: 3.8
1031 Added return value, return the new Path instance.
1032
Antoine Pitrou31119e42013-11-22 17:38:12 +01001033
1034.. method:: Path.replace(target)
1035
hui shang088a09a2019-09-11 21:26:49 +08001036 Rename this file or directory to the given *target*, and return a new Path
1037 instance pointing to *target*. If *target* points to an existing file or
1038 directory, it will be unconditionally replaced.
1039
Ram Rachumf97e42e2020-10-03 12:52:13 +03001040 The target path may be absolute or relative. Relative paths are interpreted
1041 relative to the current working directory, *not* the directory of the Path
1042 object.
1043
hui shang088a09a2019-09-11 21:26:49 +08001044 .. versionchanged:: 3.8
1045 Added return value, return the new Path instance.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001046
1047
Steve Dower98eb3602016-11-09 12:58:17 -08001048.. method:: Path.resolve(strict=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001049
1050 Make the path absolute, resolving any symlinks. A new path object is
1051 returned::
1052
1053 >>> p = Path()
1054 >>> p
1055 PosixPath('.')
1056 >>> p.resolve()
1057 PosixPath('/home/antoine/pathlib')
1058
Berker Peksag5e3677d2016-10-01 01:06:52 +03001059 "``..``" components are also eliminated (this is the only method to do so)::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001060
1061 >>> p = Path('docs/../setup.py')
1062 >>> p.resolve()
1063 PosixPath('/home/antoine/pathlib/setup.py')
1064
Steve Dower98eb3602016-11-09 12:58:17 -08001065 If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError`
1066 is raised. If *strict* is ``False``, the path is resolved as far as possible
1067 and any remainder is appended without checking whether it exists. If an
1068 infinite loop is encountered along the resolution path, :exc:`RuntimeError`
1069 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001070
Steve Dower98eb3602016-11-09 12:58:17 -08001071 .. versionadded:: 3.6
Julien Palard1d4b1602019-05-08 17:01:11 +02001072 The *strict* argument (pre-3.6 behavior is strict).
Antoine Pitrou31119e42013-11-22 17:38:12 +01001073
1074.. method:: Path.rglob(pattern)
1075
Eivind Teig537b6ca2019-02-11 11:47:09 +01001076 This is like calling :func:`Path.glob` with "``**/``" added in front of the
1077 given relative *pattern*::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001078
1079 >>> sorted(Path().rglob("*.py"))
1080 [PosixPath('build/lib/pathlib.py'),
1081 PosixPath('docs/conf.py'),
1082 PosixPath('pathlib.py'),
1083 PosixPath('setup.py'),
1084 PosixPath('test_pathlib.py')]
1085
Serhiy Storchakadb283b32020-03-08 14:31:47 +02001086 .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob
1087
Antoine Pitrou31119e42013-11-22 17:38:12 +01001088
1089.. method:: Path.rmdir()
1090
1091 Remove this directory. The directory must be empty.
1092
1093
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001094.. method:: Path.samefile(other_path)
1095
1096 Return whether this path points to the same file as *other_path*, which
1097 can be either a Path object, or a string. The semantics are similar
1098 to :func:`os.path.samefile` and :func:`os.path.samestat`.
1099
1100 An :exc:`OSError` can be raised if either file cannot be accessed for some
1101 reason.
1102
Marco Buttu7b2491a2017-04-13 16:17:59 +02001103 ::
1104
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001105 >>> p = Path('spam')
1106 >>> q = Path('eggs')
1107 >>> p.samefile(q)
1108 False
1109 >>> p.samefile('spam')
1110 True
1111
1112 .. versionadded:: 3.5
1113
1114
Antoine Pitrou31119e42013-11-22 17:38:12 +01001115.. method:: Path.symlink_to(target, target_is_directory=False)
1116
1117 Make this path a symbolic link to *target*. Under Windows,
Serhiy Storchaka03cc5652013-11-26 21:37:12 +02001118 *target_is_directory* must be true (default ``False``) if the link's target
Antoine Pitrou31119e42013-11-22 17:38:12 +01001119 is a directory. Under POSIX, *target_is_directory*'s value is ignored.
1120
Marco Buttu7b2491a2017-04-13 16:17:59 +02001121 ::
1122
Antoine Pitrou31119e42013-11-22 17:38:12 +01001123 >>> p = Path('mylink')
1124 >>> p.symlink_to('setup.py')
1125 >>> p.resolve()
1126 PosixPath('/home/antoine/pathlib/setup.py')
1127 >>> p.stat().st_size
1128 956
1129 >>> p.lstat().st_size
1130 8
1131
1132 .. note::
1133 The order of arguments (link, target) is the reverse
1134 of :func:`os.symlink`'s.
1135
1136
Zachary Ware7a26da52016-08-09 17:10:39 -05001137.. method:: Path.touch(mode=0o666, exist_ok=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001138
1139 Create a file at this given path. If *mode* is given, it is combined
1140 with the process' ``umask`` value to determine the file mode and access
1141 flags. If the file already exists, the function succeeds if *exist_ok*
1142 is true (and its modification time is updated to the current time),
Antoine Pitrouf6abb702013-12-16 21:00:53 +01001143 otherwise :exc:`FileExistsError` is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001144
1145
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001146.. method:: Path.unlink(missing_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001147
1148 Remove this file or symbolic link. If the path points to a directory,
1149 use :func:`Path.rmdir` instead.
Georg Brandlea683982014-10-01 19:12:33 +02001150
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001151 If *missing_ok* is false (the default), :exc:`FileNotFoundError` is
1152 raised if the path does not exist.
1153
1154 If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be
1155 ignored (same behavior as the POSIX ``rm -f`` command).
1156
1157 .. versionchanged:: 3.8
1158 The *missing_ok* parameter was added.
1159
Georg Brandlea683982014-10-01 19:12:33 +02001160
Joannah Nanjekye6b5b0132019-05-04 11:27:10 -04001161.. method:: Path.link_to(target)
1162
1163 Create a hard link pointing to a path named *target*.
1164
Facundo Batistaa3eae432020-08-13 17:33:56 -03001165 .. versionadded:: 3.8
Joannah Nanjekye6b5b0132019-05-04 11:27:10 -04001166
1167
Georg Brandlea683982014-10-01 19:12:33 +02001168.. method:: Path.write_bytes(data)
1169
1170 Open the file pointed to in bytes mode, write *data* to it, and close the
1171 file::
1172
1173 >>> p = Path('my_binary_file')
1174 >>> p.write_bytes(b'Binary file contents')
1175 20
1176 >>> p.read_bytes()
1177 b'Binary file contents'
1178
1179 An existing file of the same name is overwritten.
1180
1181 .. versionadded:: 3.5
1182
1183
Максим5f227412020-10-21 05:08:19 +03001184.. method:: Path.write_text(data, encoding=None, errors=None, newline=None)
Georg Brandlea683982014-10-01 19:12:33 +02001185
1186 Open the file pointed to in text mode, write *data* to it, and close the
1187 file::
1188
1189 >>> p = Path('my_text_file')
1190 >>> p.write_text('Text file contents')
1191 18
1192 >>> p.read_text()
1193 'Text file contents'
1194
Lysandros Nikolaouaf636f42019-09-11 18:08:10 +03001195 An existing file of the same name is overwritten. The optional parameters
1196 have the same meaning as in :func:`open`.
1197
Georg Brandlea683982014-10-01 19:12:33 +02001198 .. versionadded:: 3.5
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001199
Максим5f227412020-10-21 05:08:19 +03001200 .. versionchanged:: 3.10
1201 The *newline* parameter was added.
1202
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001203Correspondence to tools in the :mod:`os` module
1204-----------------------------------------------
1205
1206Below is a table mapping various :mod:`os` functions to their corresponding
1207:class:`PurePath`/:class:`Path` equivalent.
1208
1209.. note::
1210
Hong Xu1459fed2021-01-20 02:20:00 -08001211 Not all pairs of functions/methods below are equivalent. Some of them,
1212 despite having some overlapping use-cases, have different semantics. They
1213 include :func:`os.path.abspath` and :meth:`Path.resolve`,
1214 :func:`os.path.relpath` and :meth:`PurePath.relative_to`.
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001215
Xtreak6f9c55d2018-10-05 20:54:11 +05301216==================================== ==============================
Hong Xu1459fed2021-01-20 02:20:00 -08001217:mod:`os` and :mod:`os.path` :mod:`pathlib`
Xtreak6f9c55d2018-10-05 20:54:11 +05301218==================================== ==============================
Hong Xu1459fed2021-01-20 02:20:00 -08001219:func:`os.path.abspath` :meth:`Path.resolve` [#]_
Xtreak6f9c55d2018-10-05 20:54:11 +05301220:func:`os.chmod` :meth:`Path.chmod`
1221:func:`os.mkdir` :meth:`Path.mkdir`
Joannah Nanjekyef25fb6e2020-05-04 16:47:03 -03001222:func:`os.makedirs` :meth:`Path.mkdir`
Xtreak6f9c55d2018-10-05 20:54:11 +05301223:func:`os.rename` :meth:`Path.rename`
1224:func:`os.replace` :meth:`Path.replace`
1225:func:`os.rmdir` :meth:`Path.rmdir`
1226:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink`
1227:func:`os.getcwd` :func:`Path.cwd`
1228:func:`os.path.exists` :meth:`Path.exists`
1229:func:`os.path.expanduser` :meth:`Path.expanduser` and
1230 :meth:`Path.home`
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)0eb9deb2020-08-14 01:22:04 +05301231:func:`os.listdir` :meth:`Path.iterdir`
Xtreak6f9c55d2018-10-05 20:54:11 +05301232:func:`os.path.isdir` :meth:`Path.is_dir`
1233:func:`os.path.isfile` :meth:`Path.is_file`
1234:func:`os.path.islink` :meth:`Path.is_symlink`
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)0eb9deb2020-08-14 01:22:04 +05301235:func:`os.link` :meth:`Path.link_to`
1236:func:`os.symlink` :meth:`Path.symlink_to`
Girtsa01ba332019-10-23 14:18:40 -07001237:func:`os.readlink` :meth:`Path.readlink`
Hong Xu1459fed2021-01-20 02:20:00 -08001238:func:`os.path.relpath` :meth:`Path.relative_to` [#]_
Xtreak6f9c55d2018-10-05 20:54:11 +05301239:func:`os.stat` :meth:`Path.stat`,
1240 :meth:`Path.owner`,
1241 :meth:`Path.group`
1242:func:`os.path.isabs` :meth:`PurePath.is_absolute`
1243:func:`os.path.join` :func:`PurePath.joinpath`
1244:func:`os.path.basename` :data:`PurePath.name`
1245:func:`os.path.dirname` :data:`PurePath.parent`
1246:func:`os.path.samefile` :meth:`Path.samefile`
1247:func:`os.path.splitext` :data:`PurePath.suffix`
1248==================================== ==============================
Hong Xu1459fed2021-01-20 02:20:00 -08001249
1250.. rubric:: Footnotes
1251
1252.. [#] :func:`os.path.abspath` does not resolve symbolic links while :meth:`Path.resolve` does.
1253.. [#] :meth:`Path.relative_to` requires ``self`` to be the subpath of the argument, but :func:`os.path.relpath` does not.