blob: 2bbf3aad619884b1782f5d13445725ffa59969e9 [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
Antoine Pitrou31119e42013-11-22 17:38:12 +0100716.. method:: Path.stat()
717
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
Marco Buttu7b2491a2017-04-13 16:17:59 +0200721 ::
722
Antoine Pitrou31119e42013-11-22 17:38:12 +0100723 >>> p = Path('setup.py')
724 >>> p.stat().st_size
725 956
726 >>> p.stat().st_mtime
727 1327883547.852554
728
729
730.. method:: Path.chmod(mode)
731
732 Change the file mode and permissions, like :func:`os.chmod`::
733
734 >>> p = Path('setup.py')
735 >>> p.stat().st_mode
736 33277
737 >>> p.chmod(0o444)
738 >>> p.stat().st_mode
739 33060
740
741
742.. method:: Path.exists()
743
744 Whether the path points to an existing file or directory::
745
746 >>> Path('.').exists()
747 True
748 >>> Path('setup.py').exists()
749 True
750 >>> Path('/etc').exists()
751 True
752 >>> Path('nonexistentfile').exists()
753 False
754
755 .. note::
756 If the path points to a symlink, :meth:`exists` returns whether the
757 symlink *points to* an existing file or directory.
758
759
Antoine Pitrou8477ed62014-12-30 20:54:45 +0100760.. method:: Path.expanduser()
761
762 Return a new path with expanded ``~`` and ``~user`` constructs,
763 as returned by :meth:`os.path.expanduser`::
764
765 >>> p = PosixPath('~/films/Monty Python')
766 >>> p.expanduser()
767 PosixPath('/home/eric/films/Monty Python')
768
769 .. versionadded:: 3.5
770
771
Antoine Pitrou31119e42013-11-22 17:38:12 +0100772.. method:: Path.glob(pattern)
773
Eivind Teig537b6ca2019-02-11 11:47:09 +0100774 Glob the given relative *pattern* in the directory represented by this path,
Antoine Pitrou31119e42013-11-22 17:38:12 +0100775 yielding all matching files (of any kind)::
776
777 >>> sorted(Path('.').glob('*.py'))
778 [PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]
779 >>> sorted(Path('.').glob('*/*.py'))
780 [PosixPath('docs/conf.py')]
781
782 The "``**``" pattern means "this directory and all subdirectories,
783 recursively". In other words, it enables recursive globbing::
784
785 >>> sorted(Path('.').glob('**/*.py'))
786 [PosixPath('build/lib/pathlib.py'),
787 PosixPath('docs/conf.py'),
788 PosixPath('pathlib.py'),
789 PosixPath('setup.py'),
790 PosixPath('test_pathlib.py')]
791
792 .. note::
793 Using the "``**``" pattern in large directory trees may consume
794 an inordinate amount of time.
795
Serhiy Storchakadb283b32020-03-08 14:31:47 +0200796 .. audit-event:: pathlib.Path.glob self,pattern pathlib.Path.glob
797
Antoine Pitrou31119e42013-11-22 17:38:12 +0100798
799.. method:: Path.group()
800
Ned Deilyc0341562013-11-27 14:42:55 -0800801 Return the name of the group owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100802 if the file's gid isn't found in the system database.
803
804
805.. method:: Path.is_dir()
806
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200807 Return ``True`` if the path points to a directory (or a symbolic link
808 pointing to a directory), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100809
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200810 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100811 other errors (such as permission errors) are propagated.
812
813
814.. method:: Path.is_file()
815
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200816 Return ``True`` if the path points to a regular file (or a symbolic link
817 pointing to a regular file), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100818
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200819 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100820 other errors (such as permission errors) are propagated.
821
822
Łukasz Langa47320a62017-08-01 16:47:50 -0700823.. method:: Path.is_mount()
824
825 Return ``True`` if the path is a :dfn:`mount point`: a point in a
826 file system where a different file system has been mounted. On POSIX, the
827 function checks whether *path*'s parent, :file:`path/..`, is on a different
828 device than *path*, or whether :file:`path/..` and *path* point to the same
829 i-node on the same device --- this should detect mount points for all Unix
830 and POSIX variants. Not implemented on Windows.
831
832 .. versionadded:: 3.7
833
834
Antoine Pitrou31119e42013-11-22 17:38:12 +0100835.. method:: Path.is_symlink()
836
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200837 Return ``True`` if the path points to a symbolic link, ``False`` otherwise.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100838
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200839 ``False`` is also returned if the path doesn't exist; other errors (such
Antoine Pitrou31119e42013-11-22 17:38:12 +0100840 as permission errors) are propagated.
841
842
843.. method:: Path.is_socket()
844
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200845 Return ``True`` if the path points to a Unix socket (or a symbolic link
846 pointing to a Unix socket), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100847
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200848 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100849 other errors (such as permission errors) are propagated.
850
851
852.. method:: Path.is_fifo()
853
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200854 Return ``True`` if the path points to a FIFO (or a symbolic link
855 pointing to a FIFO), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100856
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200857 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100858 other errors (such as permission errors) are propagated.
859
860
861.. method:: Path.is_block_device()
862
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200863 Return ``True`` if the path points to a block device (or a symbolic link
864 pointing to a block device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100865
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200866 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100867 other errors (such as permission errors) are propagated.
868
869
870.. method:: Path.is_char_device()
871
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200872 Return ``True`` if the path points to a character device (or a symbolic link
873 pointing to a character device), ``False`` if it points to another kind of file.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100874
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200875 ``False`` is also returned if the path doesn't exist or is a broken symlink;
Antoine Pitrou31119e42013-11-22 17:38:12 +0100876 other errors (such as permission errors) are propagated.
877
878
879.. method:: Path.iterdir()
880
881 When the path points to a directory, yield path objects of the directory
882 contents::
883
884 >>> p = Path('docs')
885 >>> for child in p.iterdir(): child
886 ...
887 PosixPath('docs/conf.py')
888 PosixPath('docs/_templates')
889 PosixPath('docs/make.bat')
890 PosixPath('docs/index.rst')
891 PosixPath('docs/_build')
892 PosixPath('docs/_static')
893 PosixPath('docs/Makefile')
894
Serhiy Storchaka306cfb32020-09-04 21:19:30 +0300895 The children are yielded in arbitrary order, and the special entries
896 ``'.'`` and ``'..'`` are not included. If a file is removed from or added
897 to the directory after creating the iterator, whether an path object for
898 that file be included is unspecified.
899
Antoine Pitrou31119e42013-11-22 17:38:12 +0100900.. method:: Path.lchmod(mode)
901
902 Like :meth:`Path.chmod` but, if the path points to a symbolic link, the
903 symbolic link's mode is changed rather than its target's.
904
905
906.. method:: Path.lstat()
907
908 Like :meth:`Path.stat` but, if the path points to a symbolic link, return
909 the symbolic link's information rather than its target's.
910
911
Barry Warsaw7c549c42014-08-05 11:28:12 -0400912.. method:: Path.mkdir(mode=0o777, parents=False, exist_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +0100913
914 Create a new directory at this given path. If *mode* is given, it is
915 combined with the process' ``umask`` value to determine the file mode
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100916 and access flags. If the path already exists, :exc:`FileExistsError`
917 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100918
Serhiy Storchaka03cc5652013-11-26 21:37:12 +0200919 If *parents* is true, any missing parents of this path are created
Antoine Pitrou0048c982013-12-16 20:22:37 +0100920 as needed; they are created with the default permissions without taking
921 *mode* into account (mimicking the POSIX ``mkdir -p`` command).
922
923 If *parents* is false (the default), a missing parent raises
Antoine Pitrouf6abb702013-12-16 21:00:53 +0100924 :exc:`FileNotFoundError`.
Antoine Pitrou31119e42013-11-22 17:38:12 +0100925
Ned Deily11194f72016-10-15 15:12:03 -0400926 If *exist_ok* is false (the default), :exc:`FileExistsError` is
Barry Warsaw7c549c42014-08-05 11:28:12 -0400927 raised if the target directory already exists.
928
929 If *exist_ok* is true, :exc:`FileExistsError` exceptions will be
930 ignored (same behavior as the POSIX ``mkdir -p`` command), but only if the
931 last path component is not an existing non-directory file.
932
933 .. versionchanged:: 3.5
934 The *exist_ok* parameter was added.
935
Antoine Pitrou31119e42013-11-22 17:38:12 +0100936
937.. method:: Path.open(mode='r', buffering=-1, encoding=None, errors=None, newline=None)
938
939 Open the file pointed to by the path, like the built-in :func:`open`
940 function does::
941
942 >>> p = Path('setup.py')
943 >>> with p.open() as f:
944 ... f.readline()
945 ...
946 '#!/usr/bin/env python3\n'
947
948
949.. method:: Path.owner()
950
Ned Deilyc0341562013-11-27 14:42:55 -0800951 Return the name of the user owning the file. :exc:`KeyError` is raised
Antoine Pitrou31119e42013-11-22 17:38:12 +0100952 if the file's uid isn't found in the system database.
953
954
Georg Brandlea683982014-10-01 19:12:33 +0200955.. method:: Path.read_bytes()
956
957 Return the binary contents of the pointed-to file as a bytes object::
958
959 >>> p = Path('my_binary_file')
960 >>> p.write_bytes(b'Binary file contents')
961 20
962 >>> p.read_bytes()
963 b'Binary file contents'
964
965 .. versionadded:: 3.5
966
967
968.. method:: Path.read_text(encoding=None, errors=None)
969
970 Return the decoded contents of the pointed-to file as a string::
971
972 >>> p = Path('my_text_file')
973 >>> p.write_text('Text file contents')
974 18
975 >>> p.read_text()
976 'Text file contents'
977
Xtreak5b2657f2018-08-07 01:25:03 +0530978 The file is opened and then closed. The optional parameters have the same
979 meaning as in :func:`open`.
Georg Brandlea683982014-10-01 19:12:33 +0200980
981 .. versionadded:: 3.5
982
983
Girtsa01ba332019-10-23 14:18:40 -0700984.. method:: Path.readlink()
985
986 Return the path to which the symbolic link points (as returned by
987 :func:`os.readlink`)::
988
989 >>> p = Path('mylink')
990 >>> p.symlink_to('setup.py')
991 >>> p.readlink()
992 PosixPath('setup.py')
993
994 .. versionadded:: 3.9
995
996
Antoine Pitrou31119e42013-11-22 17:38:12 +0100997.. method:: Path.rename(target)
998
hui shang088a09a2019-09-11 21:26:49 +0800999 Rename this file or directory to the given *target*, and return a new Path
1000 instance pointing to *target*. On Unix, if *target* exists and is a file,
1001 it will be replaced silently if the user has permission. *target* can be
1002 either a string or another path object::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001003
1004 >>> p = Path('foo')
1005 >>> p.open('w').write('some text')
1006 9
1007 >>> target = Path('bar')
1008 >>> p.rename(target)
hui shang088a09a2019-09-11 21:26:49 +08001009 PosixPath('bar')
Antoine Pitrou31119e42013-11-22 17:38:12 +01001010 >>> target.open().read()
1011 'some text'
1012
Ram Rachumf97e42e2020-10-03 12:52:13 +03001013 The target path may be absolute or relative. Relative paths are interpreted
1014 relative to the current working directory, *not* the directory of the Path
1015 object.
1016
hui shang088a09a2019-09-11 21:26:49 +08001017 .. versionchanged:: 3.8
1018 Added return value, return the new Path instance.
1019
Antoine Pitrou31119e42013-11-22 17:38:12 +01001020
1021.. method:: Path.replace(target)
1022
hui shang088a09a2019-09-11 21:26:49 +08001023 Rename this file or directory to the given *target*, and return a new Path
1024 instance pointing to *target*. If *target* points to an existing file or
1025 directory, it will be unconditionally replaced.
1026
Ram Rachumf97e42e2020-10-03 12:52:13 +03001027 The target path may be absolute or relative. Relative paths are interpreted
1028 relative to the current working directory, *not* the directory of the Path
1029 object.
1030
hui shang088a09a2019-09-11 21:26:49 +08001031 .. versionchanged:: 3.8
1032 Added return value, return the new Path instance.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001033
1034
Steve Dower98eb3602016-11-09 12:58:17 -08001035.. method:: Path.resolve(strict=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001036
1037 Make the path absolute, resolving any symlinks. A new path object is
1038 returned::
1039
1040 >>> p = Path()
1041 >>> p
1042 PosixPath('.')
1043 >>> p.resolve()
1044 PosixPath('/home/antoine/pathlib')
1045
Berker Peksag5e3677d2016-10-01 01:06:52 +03001046 "``..``" components are also eliminated (this is the only method to do so)::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001047
1048 >>> p = Path('docs/../setup.py')
1049 >>> p.resolve()
1050 PosixPath('/home/antoine/pathlib/setup.py')
1051
Steve Dower98eb3602016-11-09 12:58:17 -08001052 If the path doesn't exist and *strict* is ``True``, :exc:`FileNotFoundError`
1053 is raised. If *strict* is ``False``, the path is resolved as far as possible
1054 and any remainder is appended without checking whether it exists. If an
1055 infinite loop is encountered along the resolution path, :exc:`RuntimeError`
1056 is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001057
Steve Dower98eb3602016-11-09 12:58:17 -08001058 .. versionadded:: 3.6
Julien Palard1d4b1602019-05-08 17:01:11 +02001059 The *strict* argument (pre-3.6 behavior is strict).
Antoine Pitrou31119e42013-11-22 17:38:12 +01001060
1061.. method:: Path.rglob(pattern)
1062
Eivind Teig537b6ca2019-02-11 11:47:09 +01001063 This is like calling :func:`Path.glob` with "``**/``" added in front of the
1064 given relative *pattern*::
Antoine Pitrou31119e42013-11-22 17:38:12 +01001065
1066 >>> sorted(Path().rglob("*.py"))
1067 [PosixPath('build/lib/pathlib.py'),
1068 PosixPath('docs/conf.py'),
1069 PosixPath('pathlib.py'),
1070 PosixPath('setup.py'),
1071 PosixPath('test_pathlib.py')]
1072
Serhiy Storchakadb283b32020-03-08 14:31:47 +02001073 .. audit-event:: pathlib.Path.rglob self,pattern pathlib.Path.rglob
1074
Antoine Pitrou31119e42013-11-22 17:38:12 +01001075
1076.. method:: Path.rmdir()
1077
1078 Remove this directory. The directory must be empty.
1079
1080
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001081.. method:: Path.samefile(other_path)
1082
1083 Return whether this path points to the same file as *other_path*, which
1084 can be either a Path object, or a string. The semantics are similar
1085 to :func:`os.path.samefile` and :func:`os.path.samestat`.
1086
1087 An :exc:`OSError` can be raised if either file cannot be accessed for some
1088 reason.
1089
Marco Buttu7b2491a2017-04-13 16:17:59 +02001090 ::
1091
Antoine Pitrou43e3d942014-05-13 10:50:15 +02001092 >>> p = Path('spam')
1093 >>> q = Path('eggs')
1094 >>> p.samefile(q)
1095 False
1096 >>> p.samefile('spam')
1097 True
1098
1099 .. versionadded:: 3.5
1100
1101
Antoine Pitrou31119e42013-11-22 17:38:12 +01001102.. method:: Path.symlink_to(target, target_is_directory=False)
1103
1104 Make this path a symbolic link to *target*. Under Windows,
Serhiy Storchaka03cc5652013-11-26 21:37:12 +02001105 *target_is_directory* must be true (default ``False``) if the link's target
Antoine Pitrou31119e42013-11-22 17:38:12 +01001106 is a directory. Under POSIX, *target_is_directory*'s value is ignored.
1107
Marco Buttu7b2491a2017-04-13 16:17:59 +02001108 ::
1109
Antoine Pitrou31119e42013-11-22 17:38:12 +01001110 >>> p = Path('mylink')
1111 >>> p.symlink_to('setup.py')
1112 >>> p.resolve()
1113 PosixPath('/home/antoine/pathlib/setup.py')
1114 >>> p.stat().st_size
1115 956
1116 >>> p.lstat().st_size
1117 8
1118
1119 .. note::
1120 The order of arguments (link, target) is the reverse
1121 of :func:`os.symlink`'s.
1122
1123
Zachary Ware7a26da52016-08-09 17:10:39 -05001124.. method:: Path.touch(mode=0o666, exist_ok=True)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001125
1126 Create a file at this given path. If *mode* is given, it is combined
1127 with the process' ``umask`` value to determine the file mode and access
1128 flags. If the file already exists, the function succeeds if *exist_ok*
1129 is true (and its modification time is updated to the current time),
Antoine Pitrouf6abb702013-12-16 21:00:53 +01001130 otherwise :exc:`FileExistsError` is raised.
Antoine Pitrou31119e42013-11-22 17:38:12 +01001131
1132
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001133.. method:: Path.unlink(missing_ok=False)
Antoine Pitrou31119e42013-11-22 17:38:12 +01001134
1135 Remove this file or symbolic link. If the path points to a directory,
1136 use :func:`Path.rmdir` instead.
Georg Brandlea683982014-10-01 19:12:33 +02001137
‮zlohhcuB treboRd9e006b2019-05-16 00:02:11 +02001138 If *missing_ok* is false (the default), :exc:`FileNotFoundError` is
1139 raised if the path does not exist.
1140
1141 If *missing_ok* is true, :exc:`FileNotFoundError` exceptions will be
1142 ignored (same behavior as the POSIX ``rm -f`` command).
1143
1144 .. versionchanged:: 3.8
1145 The *missing_ok* parameter was added.
1146
Georg Brandlea683982014-10-01 19:12:33 +02001147
Joannah Nanjekye6b5b0132019-05-04 11:27:10 -04001148.. method:: Path.link_to(target)
1149
1150 Create a hard link pointing to a path named *target*.
1151
Facundo Batistaa3eae432020-08-13 17:33:56 -03001152 .. versionadded:: 3.8
Joannah Nanjekye6b5b0132019-05-04 11:27:10 -04001153
1154
Georg Brandlea683982014-10-01 19:12:33 +02001155.. method:: Path.write_bytes(data)
1156
1157 Open the file pointed to in bytes mode, write *data* to it, and close the
1158 file::
1159
1160 >>> p = Path('my_binary_file')
1161 >>> p.write_bytes(b'Binary file contents')
1162 20
1163 >>> p.read_bytes()
1164 b'Binary file contents'
1165
1166 An existing file of the same name is overwritten.
1167
1168 .. versionadded:: 3.5
1169
1170
Максим5f227412020-10-21 05:08:19 +03001171.. method:: Path.write_text(data, encoding=None, errors=None, newline=None)
Georg Brandlea683982014-10-01 19:12:33 +02001172
1173 Open the file pointed to in text mode, write *data* to it, and close the
1174 file::
1175
1176 >>> p = Path('my_text_file')
1177 >>> p.write_text('Text file contents')
1178 18
1179 >>> p.read_text()
1180 'Text file contents'
1181
Lysandros Nikolaouaf636f42019-09-11 18:08:10 +03001182 An existing file of the same name is overwritten. The optional parameters
1183 have the same meaning as in :func:`open`.
1184
Georg Brandlea683982014-10-01 19:12:33 +02001185 .. versionadded:: 3.5
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001186
Максим5f227412020-10-21 05:08:19 +03001187 .. versionchanged:: 3.10
1188 The *newline* parameter was added.
1189
Jamiel Almeidaae8750b2017-06-02 11:36:02 -07001190Correspondence to tools in the :mod:`os` module
1191-----------------------------------------------
1192
1193Below is a table mapping various :mod:`os` functions to their corresponding
1194:class:`PurePath`/:class:`Path` equivalent.
1195
1196.. note::
1197
1198 Although :func:`os.path.relpath` and :meth:`PurePath.relative_to` have some
1199 overlapping use-cases, their semantics differ enough to warrant not
1200 considering them equivalent.
1201
Xtreak6f9c55d2018-10-05 20:54:11 +05301202==================================== ==============================
1203os and os.path pathlib
1204==================================== ==============================
1205:func:`os.path.abspath` :meth:`Path.resolve`
1206:func:`os.chmod` :meth:`Path.chmod`
1207:func:`os.mkdir` :meth:`Path.mkdir`
Joannah Nanjekyef25fb6e2020-05-04 16:47:03 -03001208:func:`os.makedirs` :meth:`Path.mkdir`
Xtreak6f9c55d2018-10-05 20:54:11 +05301209:func:`os.rename` :meth:`Path.rename`
1210:func:`os.replace` :meth:`Path.replace`
1211:func:`os.rmdir` :meth:`Path.rmdir`
1212:func:`os.remove`, :func:`os.unlink` :meth:`Path.unlink`
1213:func:`os.getcwd` :func:`Path.cwd`
1214:func:`os.path.exists` :meth:`Path.exists`
1215:func:`os.path.expanduser` :meth:`Path.expanduser` and
1216 :meth:`Path.home`
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)0eb9deb2020-08-14 01:22:04 +05301217:func:`os.listdir` :meth:`Path.iterdir`
Xtreak6f9c55d2018-10-05 20:54:11 +05301218:func:`os.path.isdir` :meth:`Path.is_dir`
1219:func:`os.path.isfile` :meth:`Path.is_file`
1220:func:`os.path.islink` :meth:`Path.is_symlink`
Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి)0eb9deb2020-08-14 01:22:04 +05301221:func:`os.link` :meth:`Path.link_to`
1222:func:`os.symlink` :meth:`Path.symlink_to`
Girtsa01ba332019-10-23 14:18:40 -07001223:func:`os.readlink` :meth:`Path.readlink`
Xtreak6f9c55d2018-10-05 20:54:11 +05301224:func:`os.stat` :meth:`Path.stat`,
1225 :meth:`Path.owner`,
1226 :meth:`Path.group`
1227:func:`os.path.isabs` :meth:`PurePath.is_absolute`
1228:func:`os.path.join` :func:`PurePath.joinpath`
1229:func:`os.path.basename` :data:`PurePath.name`
1230:func:`os.path.dirname` :data:`PurePath.parent`
1231:func:`os.path.samefile` :meth:`Path.samefile`
1232:func:`os.path.splitext` :data:`PurePath.suffix`
1233==================================== ==============================