blob: bf6fee44df2c8851cb7eebf1db6858189858e0a6 [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
339
340.. data:: PurePath.parent
341
342 The logical parent of the path::
343
344 >>> p = PurePosixPath('/a/b/c/d')
345 >>> p.parent
346 PurePosixPath('/a/b/c')
347
348 You cannot go past an anchor, or empty path::
349
350 >>> p = PurePosixPath('/')
351 >>> p.parent
352 PurePosixPath('/')
353 >>> p = PurePosixPath('.')
354 >>> p.parent
355 PurePosixPath('.')
356
357 .. note::
358 This is a purely lexical operation, hence the following behaviour::
359
360 >>> p = PurePosixPath('foo/..')
361 >>> p.parent
362 PurePosixPath('foo')
363
364 If you want to walk an arbitrary filesystem path upwards, it is
365 recommended to first call :meth:`Path.resolve` so as to resolve
366 symlinks and eliminate `".."` components.
367
368
369.. data:: PurePath.name
370
371 A string representing the final path component, excluding the drive and
372 root, if any::
373
374 >>> PurePosixPath('my/library/setup.py').name
375 'setup.py'
376
377 UNC drive names are not considered::
378
379 >>> PureWindowsPath('//some/share/setup.py').name
380 'setup.py'
381 >>> PureWindowsPath('//some/share').name
382 ''
383
384
385.. data:: PurePath.suffix
386
387 The file extension of the final component, if any::
388
389 >>> PurePosixPath('my/library/setup.py').suffix
390 '.py'
391 >>> PurePosixPath('my/library.tar.gz').suffix
392 '.gz'
393 >>> PurePosixPath('my/library').suffix
394 ''
395
396
397.. data:: PurePath.suffixes
398
399 A list of the path's file extensions::
400
401 >>> PurePosixPath('my/library.tar.gar').suffixes
402 ['.tar', '.gar']
403 >>> PurePosixPath('my/library.tar.gz').suffixes
404 ['.tar', '.gz']
405 >>> PurePosixPath('my/library').suffixes
406 []
407
408
409.. data:: PurePath.stem
410
411 The final path component, without its suffix::
412
413 >>> PurePosixPath('my/library.tar.gz').stem
414 'library.tar'
415 >>> PurePosixPath('my/library.tar').stem
416 'library'
417 >>> PurePosixPath('my/library').stem
418 'library'
419
420
421.. method:: PurePath.as_posix()
422
423 Return a string representation of the path with forward slashes (``/``)::
424
425 >>> p = PureWindowsPath('c:\\windows')
426 >>> str(p)
427 'c:\\windows'
428 >>> p.as_posix()
429 'c:/windows'
430
431
432.. method:: PurePath.as_uri()
433
434 Represent the path as a ``file`` URI. :exc:`ValueError` is raised if
435 the path isn't absolute.
436
437 >>> p = PurePosixPath('/etc/passwd')
438 >>> p.as_uri()
439 'file:///etc/passwd'
440 >>> p = PureWindowsPath('c:/Windows')
441 >>> p.as_uri()
442 'file:///c:/Windows'
443
444
445.. method:: PurePath.is_absolute()
446
447 Return whether the path is absolute or not. A path is considered absolute
448 if it has both a root and (if the flavour allows) a drive::
449
450 >>> PurePosixPath('/a/b').is_absolute()
451 True
452 >>> PurePosixPath('a/b').is_absolute()
453 False
454
455 >>> PureWindowsPath('c:/a/b').is_absolute()
456 True
457 >>> PureWindowsPath('/a/b').is_absolute()
458 False
459 >>> PureWindowsPath('c:').is_absolute()
460 False
461 >>> PureWindowsPath('//some/share').is_absolute()
462 True
463
464
Hai Shi82642a02019-08-13 14:54:02 -0500465.. method:: PurePath.is_relative_to(*other)
466
467 Return whether or not this path is relative to the *other* path.
468
469 >>> p = PurePath('/etc/passwd')
470 >>> p.is_relative_to('/etc')
471 True
472 >>> p.is_relative_to('/usr')
473 False
474
475 .. versionadded:: 3.9
476
477
Antoine Pitrou31119e42013-11-22 17:38:12 +0100478.. method:: PurePath.is_reserved()
479
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200480 With :class:`PureWindowsPath`, return ``True`` if the path is considered
481 reserved under Windows, ``False`` otherwise. With :class:`PurePosixPath`,
482 ``False`` is always returned.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100483
484 >>> PureWindowsPath('nul').is_reserved()
485 True
486 >>> PurePosixPath('nul').is_reserved()
487 False
488
489 File system calls on reserved paths can fail mysteriously or have
490 unintended effects.
491
492
493.. method:: PurePath.joinpath(*other)
494
Andrew Kuchling7a4e2d12013-11-22 15:45:02 -0500495 Calling this method is equivalent to combining the path with each of
Antoine Pitrou31119e42013-11-22 17:38:12 +0100496 the *other* arguments in turn::
497
498 >>> PurePosixPath('/etc').joinpath('passwd')
499 PurePosixPath('/etc/passwd')
500 >>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))
501 PurePosixPath('/etc/passwd')
502 >>> PurePosixPath('/etc').joinpath('init.d', 'apache2')
503 PurePosixPath('/etc/init.d/apache2')
504 >>> PureWindowsPath('c:').joinpath('/Program Files')
505 PureWindowsPath('c:/Program Files')
506
507
508.. method:: PurePath.match(pattern)
509
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200510 Match this path against the provided glob-style pattern. Return ``True``
511 if matching is successful, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100512
513 If *pattern* is relative, the path can be either relative or absolute,
514 and matching is done from the right::
515
516 >>> PurePath('a/b.py').match('*.py')
517 True
518 >>> PurePath('/a/b/c.py').match('b/*.py')
519 True
520 >>> PurePath('/a/b/c.py').match('a/*.py')
521 False
522
523 If *pattern* is absolute, the path must be absolute, and the whole path
524 must match::
525
526 >>> PurePath('/a.py').match('/*.py')
527 True
528 >>> PurePath('a/b.py').match('/*.py')
529 False
530
Tim Loc12375a2020-04-19 05:43:11 -0400531 As with other methods, case-sensitivity follows platform defaults::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100532
Tim Loc12375a2020-04-19 05:43:11 -0400533 >>> PurePosixPath('b.py').match('*.PY')
534 False
Antoine Pitrou31119e42013-11-22 17:38:12 +0100535 >>> PureWindowsPath('b.py').match('*.PY')
536 True
537
538
539.. method:: PurePath.relative_to(*other)
540
541 Compute a version of this path relative to the path represented by
542 *other*. If it's impossible, ValueError is raised::
543
544 >>> p = PurePosixPath('/etc/passwd')
545 >>> p.relative_to('/')
546 PurePosixPath('etc/passwd')
547 >>> p.relative_to('/etc')
548 PurePosixPath('passwd')
549 >>> p.relative_to('/usr')
550 Traceback (most recent call last):
551 File "<stdin>", line 1, in <module>
552 File "pathlib.py", line 694, in relative_to
553 .format(str(self), str(formatted)))
Rotuna44832532020-05-25 21:42:28 +0200554 ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other absolute.
555
556 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 +0100557
558
Antoine Pitrouef851192014-02-25 20:33:02 +0100559.. method:: PurePath.with_name(name)
560
561 Return a new path with the :attr:`name` changed. If the original path
562 doesn't have a name, ValueError is raised::
563
564 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
565 >>> p.with_name('setup.py')
566 PureWindowsPath('c:/Downloads/setup.py')
567 >>> p = PureWindowsPath('c:/')
568 >>> p.with_name('setup.py')
569 Traceback (most recent call last):
570 File "<stdin>", line 1, in <module>
571 File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_name
572 raise ValueError("%r has an empty name" % (self,))
573 ValueError: PureWindowsPath('c:/') has an empty name
574
575
Tim Hoffmann8aea4b32020-04-19 17:29:49 +0200576.. method:: PurePath.with_stem(stem)
577
578 Return a new path with the :attr:`stem` changed. If the original path
579 doesn't have a name, ValueError is raised::
580
581 >>> p = PureWindowsPath('c:/Downloads/draft.txt')
582 >>> p.with_stem('final')
583 PureWindowsPath('c:/Downloads/final.txt')
584 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
585 >>> p.with_stem('lib')
586 PureWindowsPath('c:/Downloads/lib.gz')
587 >>> p = PureWindowsPath('c:/')
588 >>> p.with_stem('')
589 Traceback (most recent call last):
590 File "<stdin>", line 1, in <module>
591 File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stem
592 return self.with_name(stem + self.suffix)
593 File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_name
594 raise ValueError("%r has an empty name" % (self,))
595 ValueError: PureWindowsPath('c:/') has an empty name
596
597 .. versionadded:: 3.9
598
599
Antoine Pitrouef851192014-02-25 20:33:02 +0100600.. method:: PurePath.with_suffix(suffix)
601
602 Return a new path with the :attr:`suffix` changed. If the original path
Stefan Otte46dc4e32018-08-03 22:49:42 +0200603 doesn't have a suffix, the new *suffix* is appended instead. If the
604 *suffix* is an empty string, the original suffix is removed::
Antoine Pitrouef851192014-02-25 20:33:02 +0100605
606 >>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')
607 >>> p.with_suffix('.bz2')
608 PureWindowsPath('c:/Downloads/pathlib.tar.bz2')
609 >>> p = PureWindowsPath('README')
610 >>> p.with_suffix('.txt')
611 PureWindowsPath('README.txt')
Stefan Otte46dc4e32018-08-03 22:49:42 +0200612 >>> p = PureWindowsPath('README.txt')
613 >>> p.with_suffix('')
614 PureWindowsPath('README')
Antoine Pitrouef851192014-02-25 20:33:02 +0100615
616
Antoine Pitrou31119e42013-11-22 17:38:12 +0100617.. _concrete-paths:
618
619
620Concrete paths
621--------------
622
623Concrete paths are subclasses of the pure path classes. In addition to
624operations provided by the latter, they also provide methods to do system
625calls on path objects. There are three ways to instantiate concrete paths:
626
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800627.. class:: Path(*pathsegments)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100628
629 A subclass of :class:`PurePath`, this class represents concrete paths of
630 the system's path flavour (instantiating it creates either a
631 :class:`PosixPath` or a :class:`WindowsPath`)::
632
633 >>> Path('setup.py')
634 PosixPath('setup.py')
635
Eli Benderskyb6e66eb2013-11-28 06:53:05 -0800636 *pathsegments* is specified similarly to :class:`PurePath`.
637
638.. class:: PosixPath(*pathsegments)
639
640 A subclass of :class:`Path` and :class:`PurePosixPath`, this class
641 represents concrete non-Windows filesystem paths::
642
643 >>> PosixPath('/etc')
644 PosixPath('/etc')
645
646 *pathsegments* is specified similarly to :class:`PurePath`.
647
648.. class:: WindowsPath(*pathsegments)
649
650 A subclass of :class:`Path` and :class:`PureWindowsPath`, this class
651 represents concrete Windows filesystem paths::
652
653 >>> WindowsPath('c:/Program Files/')
654 WindowsPath('c:/Program Files')
655
656 *pathsegments* is specified similarly to :class:`PurePath`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100657
658You can only instantiate the class flavour that corresponds to your system
659(allowing system calls on non-compatible path flavours could lead to
660bugs or failures in your application)::
661
662 >>> import os
663 >>> os.name
664 'posix'
665 >>> Path('setup.py')
666 PosixPath('setup.py')
667 >>> PosixPath('setup.py')
668 PosixPath('setup.py')
669 >>> WindowsPath('setup.py')
670 Traceback (most recent call last):
671 File "<stdin>", line 1, in <module>
672 File "pathlib.py", line 798, in __new__
673 % (cls.__name__,))
674 NotImplementedError: cannot instantiate 'WindowsPath' on your system
675
676
677Methods
678^^^^^^^
679
680Concrete paths provide the following methods in addition to pure paths
681methods. Many of these methods can raise an :exc:`OSError` if a system
Serhiy Storchaka0185f342018-09-18 11:28:51 +0300682call fails (for example because the path doesn't exist).
683
684.. versionchanged:: 3.8
685
686 :meth:`~Path.exists()`, :meth:`~Path.is_dir()`, :meth:`~Path.is_file()`,
687 :meth:`~Path.is_mount()`, :meth:`~Path.is_symlink()`,
688 :meth:`~Path.is_block_device()`, :meth:`~Path.is_char_device()`,
689 :meth:`~Path.is_fifo()`, :meth:`~Path.is_socket()` now return ``False``
690 instead of raising an exception for paths that contain characters
691 unrepresentable at the OS level.
692
Antoine Pitrou31119e42013-11-22 17:38:12 +0100693
694.. classmethod:: Path.cwd()
695
696 Return a new path object representing the current directory (as returned
697 by :func:`os.getcwd`)::
698
699 >>> Path.cwd()
700 PosixPath('/home/antoine/pathlib')
701
702
Antoine Pitrou17cba7d2015-01-12 21:03:41 +0100703.. classmethod:: Path.home()
704
705 Return a new path object representing the user's home directory (as
706 returned by :func:`os.path.expanduser` with ``~`` construct)::
707
708 >>> Path.home()
709 PosixPath('/home/antoine')
710
711 .. versionadded:: 3.5
712
713
Antoine Pitrou31119e42013-11-22 17:38:12 +0100714.. method:: Path.stat()
715
Brett Cannon67152d02020-03-04 14:51:50 -0800716 Return a :class:`os.stat_result` object containing information about this path, like :func:`os.stat`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100717 The result is looked up at each call to this method.
718
Marco Buttu7b2491a2017-04-13 16:17:59 +0200719 ::
720
Antoine Pitrou31119e42013-11-22 17:38:12 +0100721 >>> p = Path('setup.py')
722 >>> p.stat().st_size
723 956
724 >>> p.stat().st_mtime
725 1327883547.852554
726
727
728.. method:: Path.chmod(mode)
729
730 Change the file mode and permissions, like :func:`os.chmod`::
731
732 >>> p = Path('setup.py')
733 >>> p.stat().st_mode
734 33277
735 >>> p.chmod(0o444)
736 >>> p.stat().st_mode
737 33060
738
739
740.. method:: Path.exists()
741
742 Whether the path points to an existing file or directory::
743
744 >>> Path('.').exists()
745 True
746 >>> Path('setup.py').exists()
747 True
748 >>> Path('/etc').exists()
749 True
750 >>> Path('nonexistentfile').exists()
751 False
752
753 .. note::
754 If the path points to a symlink, :meth:`exists` returns whether the
755 symlink *points to* an existing file or directory.
756
757
Antoine Pitrou8477ed62014-12-30 20:54:45 +0100758.. method:: Path.expanduser()
759
760 Return a new path with expanded ``~`` and ``~user`` constructs,
761 as returned by :meth:`os.path.expanduser`::
762
763 >>> p = PosixPath('~/films/Monty Python')
764 >>> p.expanduser()
765 PosixPath('/home/eric/films/Monty Python')
766
767 .. versionadded:: 3.5
768
769
Antoine Pitrou31119e42013-11-22 17:38:12 +0100770.. method:: Path.glob(pattern)
771
Eivind Teig537b6ca2019-02-11 11:47:09 +0100772 Glob the given relative *pattern* in the directory represented by this path,
Antoine Pitrou31119e42013-11-22 17:38:12 +0100773 yielding all matching files (of any kind)::
774
775 >>> sorted(Path('.').glob('*.py'))
776 [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
777 >>> sorted(Path('.').glob('*/*.py'))
778 [PosixPath('docs/conf.py')]
779
780 The "``**``" pattern means "this directory and all subdirectories,
781 recursively". In other words, it enables recursive globbing::
782
783 >>> sorted(Path('.').glob('**/*.py'))
784 [PosixPath('build/lib/pathlib.py'),
785 PosixPath('docs/conf.py'),
786 PosixPath('pathlib.py'),
787 PosixPath('setup.py'),
788 PosixPath('test_pathlib.py')]
789
790 .. note::
791 Using the "``**``" pattern in large directory trees may consume
792 an inordinate amount of time.
793
Serhiy Storchakadb283b32020-03-08 14:31:47 +0200794 .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob
795
Antoine Pitrou31119e42013-11-22 17:38:12 +0100796
797.. method:: Path.group()
798
Ned Deilyc0341562013-11-27 14:42:55 -0800799 Return the name of the group owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100800 if the file's gid isn't found in the system database.
801
802
803.. method:: Path.is_dir()
804
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200805 Return ``True`` if the path points to a directory (or a symbolic link
806 pointing to a directory), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100807
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200808 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100809 other errors (such as permission errors) are propagated.
810
811
812.. method:: Path.is_file()
813
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200814 Return ``True`` if the path points to a regular file (or a symbolic link
815 pointing to a regular file), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100816
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200817 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100818 other errors (such as permission errors) are propagated.
819
820
Łukasz Langa47320a62017-08-01 16:47:50 -0700821.. method:: Path.is_mount()
822
823 Return ``True`` if the path is a :dfn:`mount point`: a point in a
824 file system where a different file system has been mounted. On POSIX, the
825 function checks whether *path*'s parent, :file:`path/..`, is on a different
826 device than *path*, or whether :file:`path/..` and *path* point to the same
827 i-node on the same device --- this should detect mount points for all Unix
828 and POSIX variants. Not implemented on Windows.
829
830 .. versionadded:: 3.7
831
832
Antoine Pitrou31119e42013-11-22 17:38:12 +0100833.. method:: Path.is_symlink()
834
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200835 Return ``True`` if the path points to a symbolic link, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100836
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200837 ``False`` is also returned if the path doesn't exist; other errors (such
Antoine Pitrou31119e42013-11-22 17:38:12 +0100838 as permission errors) are propagated.
839
840
841.. method:: Path.is_socket()
842
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200843 Return ``True`` if the path points to a Unix socket (or a symbolic link
844 pointing to a Unix socket), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100845
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200846 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100847 other errors (such as permission errors) are propagated.
848
849
850.. method:: Path.is_fifo()
851
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200852 Return ``True`` if the path points to a FIFO (or a symbolic link
853 pointing to a FIFO), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100854
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200855 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100856 other errors (such as permission errors) are propagated.
857
858
859.. method:: Path.is_block_device()
860
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200861 Return ``True`` if the path points to a block device (or a symbolic link
862 pointing to a block device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100863
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200864 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100865 other errors (such as permission errors) are propagated.
866
867
868.. method:: Path.is_char_device()
869
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200870 Return ``True`` if the path points to a character device (or a symbolic link
871 pointing to a character device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100872
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200873 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100874 other errors (such as permission errors) are propagated.
875
876
877.. method:: Path.iterdir()
878
879 When the path points to a directory, yield path objects of the directory
880 contents::
881
882 >>> p = Path('docs')
883 >>> for child in p.iterdir(): child
884 ...
885 PosixPath('docs/conf.py')
886 PosixPath('docs/_templates')
887 PosixPath('docs/make.bat')
888 PosixPath('docs/index.rst')
889 PosixPath('docs/_build')
890 PosixPath('docs/_static')
891 PosixPath('docs/Makefile')
892
893.. method:: Path.lchmod(mode)
894
895 Like :meth:`Path.chmod` but, if the path points to a symbolic link, the
896 symbolic link's mode is changed rather than its target's.
897
898
899.. method:: Path.lstat()
900
901 Like :meth:`Path.stat` but, if the path points to a symbolic link, return
902 the symbolic link's information rather than its target's.
903
904
Barry Warsaw7c549c42014-08-05 11:28:12 -0400905.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100906
907 Create a new directory at this given path. If *mode* is given, it is
908 combined with the process' ``umask`` value to determine the file mode
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100909 and access flags. If the path already exists, :exc:`FileExistsError`
910 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100911
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200912 If *parents* is true, any missing parents of this path are created
Antoine Pitrou0048c982013-12-16 20:22:37 +0100913 as needed; they are created with the default permissions without taking
914 *mode* into account (mimicking the POSIX ``mkdir -p`` command).
915
916 If *parents* is false (the default), a missing parent raises
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100917 :exc:`FileNotFoundError`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100918
Ned Deily11194f72016-10-15 15:12:03 -0400919 If *exist_ok* is false (the default), :exc:`FileExistsError` is
Barry Warsaw7c549c42014-08-05 11:28:12 -0400920 raised if the target directory already exists.
921
922 If *exist_ok* is true, :exc:`FileExistsError` exceptions will be
923 ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the
924 last path component is not an existing non-directory file.
925
926 .. versionchanged:: 3.5
927 The *exist_ok* parameter was added.
928
Antoine Pitrou31119e42013-11-22 17:38:12 +0100929
930.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
931
932 Open the file pointed to by the path, like the built-in :func:`open`
933 function does::
934
935 >>> p = Path('setup.py')
936 >>> with p.open() as f:
937 ... f.readline()
938 ...
939 '#!/usr/bin/env python3\n'
940
941
942.. method:: Path.owner()
943
Ned Deilyc0341562013-11-27 14:42:55 -0800944 Return the name of the user owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100945 if the file's uid isn't found in the system database.
946
947
Georg Brandlea683982014-10-01 19:12:33 +0200948.. method:: Path.read_bytes()
949
950 Return the binary contents of the pointed-to file as a bytes object::
951
952 >>> p = Path('my_binary_file')
953 >>> p.write_bytes(b'Binary file contents')
954 20
955 >>> p.read_bytes()
956 b'Binary file contents'
957
958 .. versionadded:: 3.5
959
960
961.. method:: Path.read_text(encoding=None, errors=None)
962
963 Return the decoded contents of the pointed-to file as a string::
964
965 >>> p = Path('my_text_file')
966 >>> p.write_text('Text file contents')
967 18
968 >>> p.read_text()
969 'Text file contents'
970
Xtreak5b2657f2018-08-07 01:25:03 +0530971 The file is opened and then closed. The optional parameters have the same
972 meaning as in :func:`open`.
Georg Brandlea683982014-10-01 19:12:33 +0200973
974 .. versionadded:: 3.5
975
976
Girtsa01ba332019-10-23 14:18:40 -0700977.. method:: Path.readlink()
978
979 Return the path to which the symbolic link points (as returned by
980 :func:`os.readlink`)::
981
982 >>> p = Path('mylink')
983 >>> p.symlink_to('setup.py')
984 >>> p.readlink()
985 PosixPath('setup.py')
986
987 .. versionadded:: 3.9
988
989
Antoine Pitrou31119e42013-11-22 17:38:12 +0100990.. method:: Path.rename(target)
991
hui shang088a09a2019-09-11 21:26:49 +0800992 Rename this file or directory to the given *target*, and return a new Path
993 instance pointing to *target*. On Unix, if *target* exists and is a file,
994 it will be replaced silently if the user has permission. *target* can be
995 either a string or another path object::
Antoine Pitrou31119e42013-11-22 17:38:12 +0100996
997 >>> p = Path('foo')
998 >>> p.open('w').write('some text')
999 9
1000 >>> target = Path('bar')
1001 >>> p.rename(target)
hui shang088a09a2019-09-11 21:26:49 +08001002 PosixPath('bar')
Antoine Pitrou31119e42013-11-22 17:38:12 +01001003 >>> target.open().read()
1004 'some text'
1005
hui shang088a09a2019-09-11 21:26:49 +08001006 .. versionchanged:: 3.8
1007 Added return value, return the new Path instance.
1008
Antoine Pitrou31119e42013-11-22 17:38:12 +01001009
1010.. method:: Path.replace(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*. If *target* points to an existing file or
1014 directory, it will be unconditionally replaced.
1015
1016 .. versionchanged:: 3.8
1017 Added return value, return the new Path instance.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001018
1019
Steve Dower98eb3602016-11-09 12:58:17 -08001020.. method:: Path.resolve(strict=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001021
1022 Make the path absolute, resolving any symlinks. A new path object is
1023 returned::
1024
1025 >>> p = Path()
1026 >>> p
1027 PosixPath('.')
1028 >>> p.resolve()
1029 PosixPath('/home/antoine/pathlib')
1030
Berker Peksag5e3677d2016-10-01 01:06:52 +03001031 "``..``" components are also eliminated (this is the only method to do so)::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001032
1033 >>> p = Path('docs/../setup.py')
1034 >>> p.resolve()
1035 PosixPath('/home/antoine/pathlib/setup.py')
1036
Steve Dower98eb3602016-11-09 12:58:17 -08001037 If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError`
1038 is raised. If *strict* is ``False``, the path is resolved as far as possible
1039 and any remainder is appended without checking whether it exists. If an
1040 infinite loop is encountered along the resolution path, :exc:`RuntimeError`
1041 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001042
Steve Dower98eb3602016-11-09 12:58:17 -08001043 .. versionadded:: 3.6
Julien Palard1d4b1602019-05-08 17:01:11 +02001044 The *strict* argument (pre-3.6 behavior is strict).
Antoine Pitrou31119e42013-11-22 17:38:12 +01001045
1046.. method:: Path.rglob(pattern)
1047
Eivind Teig537b6ca2019-02-11 11:47:09 +01001048 This is like calling :func:`Path.glob` with "``**/``" added in front of the
1049 given relative *pattern*::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001050
1051 >>> sorted(Path().rglob("*.py"))
1052 [PosixPath('build/lib/pathlib.py'),
1053 PosixPath('docs/conf.py'),
1054 PosixPath('pathlib.py'),
1055 PosixPath('setup.py'),
1056 PosixPath('test_pathlib.py')]
1057
Serhiy Storchakadb283b32020-03-08 14:31:47 +02001058 .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob
1059
Antoine Pitrou31119e42013-11-22 17:38:12 +01001060
1061.. method:: Path.rmdir()
1062
1063 Remove this directory. The directory must be empty.
1064
1065
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001066.. method:: Path.samefile(other_path)
1067
1068 Return whether this path points to the same file as *other_path*, which
1069 can be either a Path object, or a string. The semantics are similar
1070 to :func:`os.path.samefile` and :func:`os.path.samestat`.
1071
1072 An :exc:`OSError` can be raised if either file cannot be accessed for some
1073 reason.
1074
Marco Buttu7b2491a2017-04-13 16:17:59 +02001075 ::
1076
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001077 >>> p = Path('spam')
1078 >>> q = Path('eggs')
1079 >>> p.samefile(q)
1080 False
1081 >>> p.samefile('spam')
1082 True
1083
1084 .. versionadded:: 3.5
1085
1086
Antoine Pitrou31119e42013-11-22 17:38:12 +01001087.. method:: Path.symlink_to(target, target_is_directory=False)
1088
1089 Make this path a symbolic link to *target*. Under Windows,
Serhiy Storchaka03cc5652013-11-26 21:37:12 +02001090 *target_is_directory* must be true (default ``False``) if the link's target
Antoine Pitrou31119e42013-11-22 17:38:12 +01001091 is a directory. Under POSIX, *target_is_directory*'s value is ignored.
1092
Marco Buttu7b2491a2017-04-13 16:17:59 +02001093 ::
1094
Antoine Pitrou31119e42013-11-22 17:38:12 +01001095 >>> p = Path('mylink')
1096 >>> p.symlink_to('setup.py')
1097 >>> p.resolve()
1098 PosixPath('/home/antoine/pathlib/setup.py')
1099 >>> p.stat().st_size
1100 956
1101 >>> p.lstat().st_size
1102 8
1103
1104 .. note::
1105 The order of arguments (link, target) is the reverse
1106 of :func:`os.symlink`'s.
1107
1108
Zachary Ware7a26da52016-08-09 17:10:39 -05001109.. method:: Path.touch(mode=0o666, exist_ok=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001110
1111 Create a file at this given path. If *mode* is given, it is combined
1112 with the process' ``umask`` value to determine the file mode and access
1113 flags. If the file already exists, the function succeeds if *exist_ok*
1114 is true (and its modification time is updated to the current time),
Antoine Pitrouf6abb702013-12-16 21:00:53 +01001115 otherwise :exc:`FileExistsError` is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001116
1117
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001118.. method:: Path.unlink(missing_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001119
1120 Remove this file or symbolic link. If the path points to a directory,
1121 use :func:`Path.rmdir` instead.
Georg Brandlea683982014-10-01 19:12:33 +02001122
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001123 If *missing_ok* is false (the default), :exc:`FileNotFoundError` is
1124 raised if the path does not exist.
1125
1126 If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be
1127 ignored (same behavior as the POSIX ``rm -f`` command).
1128
1129 .. versionchanged:: 3.8
1130 The *missing_ok* parameter was added.
1131
Georg Brandlea683982014-10-01 19:12:33 +02001132
Joannah Nanjekye6b5b0132019-05-04 11:27:10 -04001133.. method:: Path.link_to(target)
1134
1135 Create a hard link pointing to a path named *target*.
1136
1137 .. versionchanged:: 3.8
1138
1139
Georg Brandlea683982014-10-01 19:12:33 +02001140.. method:: Path.write_bytes(data)
1141
1142 Open the file pointed to in bytes mode, write *data* to it, and close the
1143 file::
1144
1145 >>> p = Path('my_binary_file')
1146 >>> p.write_bytes(b'Binary file contents')
1147 20
1148 >>> p.read_bytes()
1149 b'Binary file contents'
1150
1151 An existing file of the same name is overwritten.
1152
1153 .. versionadded:: 3.5
1154
1155
1156.. method:: Path.write_text(data, encoding=None, errors=None)
1157
1158 Open the file pointed to in text mode, write *data* to it, and close the
1159 file::
1160
1161 >>> p = Path('my_text_file')
1162 >>> p.write_text('Text file contents')
1163 18
1164 >>> p.read_text()
1165 'Text file contents'
1166
Lysandros Nikolaouaf636f42019-09-11 18:08:10 +03001167 An existing file of the same name is overwritten. The optional parameters
1168 have the same meaning as in :func:`open`.
1169
Georg Brandlea683982014-10-01 19:12:33 +02001170 .. versionadded:: 3.5
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001171
1172Correspondence to tools in the :mod:`os` module
1173-----------------------------------------------
1174
1175Below is a table mapping various :mod:`os` functions to their corresponding
1176:class:`PurePath`/:class:`Path` equivalent.
1177
1178.. note::
1179
1180 Although :func:`os.path.relpath` and :meth:`PurePath.relative_to` have some
1181 overlapping use-cases, their semantics differ enough to warrant not
1182 considering them equivalent.
1183
Xtreak6f9c55d2018-10-05 20:54:11 +05301184==================================== ==============================
1185os and os.path pathlib
1186==================================== ==============================
1187:func:`os.path.abspath` :meth:`Path.resolve`
1188:func:`os.chmod` :meth:`Path.chmod`
1189:func:`os.mkdir` :meth:`Path.mkdir`
Joannah Nanjekyef25fb6e2020-05-04 16:47:03 -03001190:func:`os.makedirs` :meth:`Path.mkdir`
Xtreak6f9c55d2018-10-05 20:54:11 +05301191:func:`os.rename` :meth:`Path.rename`
1192:func:`os.replace` :meth:`Path.replace`
1193:func:`os.rmdir` :meth:`Path.rmdir`
1194:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink`
1195:func:`os.getcwd` :func:`Path.cwd`
1196:func:`os.path.exists` :meth:`Path.exists`
1197:func:`os.path.expanduser` :meth:`Path.expanduser` and
1198 :meth:`Path.home`
1199:func:`os.path.isdir` :meth:`Path.is_dir`
1200:func:`os.path.isfile` :meth:`Path.is_file`
1201:func:`os.path.islink` :meth:`Path.is_symlink`
Girtsa01ba332019-10-23 14:18:40 -07001202:func:`os.readlink` :meth:`Path.readlink`
Xtreak6f9c55d2018-10-05 20:54:11 +05301203:func:`os.stat` :meth:`Path.stat`,
1204 :meth:`Path.owner`,
1205 :meth:`Path.group`
1206:func:`os.path.isabs` :meth:`PurePath.is_absolute`
1207:func:`os.path.join` :func:`PurePath.joinpath`
1208:func:`os.path.basename` :data:`PurePath.name`
1209:func:`os.path.dirname` :data:`PurePath.parent`
1210:func:`os.path.samefile` :meth:`Path.samefile`
1211:func:`os.path.splitext` :data:`PurePath.suffix`
1212==================================== ==============================