این ماژول کلاسهایی را ارائه میدهد که مسیرهای سامانه فایلبندی را با معناشناسی مناسب برای سیستمعاملهای مختلف بازنمایی میکنند. کلاسهای مسیر بین مسیرهای خالص، که عملیات کاملاً محاسباتی بدون ورودی/خروجی را فراهم میکنند، و مسیرهای ملموس، که از مسیرهای خالص ارث میبرند اما عملیات ورودی/خروجی را نیز فراهم میکنند، تقسیم میشوند.
اگر تاکنون از این ماژول استفاده نکردهاید یا صرفاً اطمینان ندارید کدام کلاس برای کار شما مناسب است، Path به احتمال زیاد همان چیزی است که به آن نیاز دارید. این کلاس یک مسیر مشخص را برای سکویی که کد روی آن اجرا میشود، نمونهسازی میکند.
مسیرهای خالص در برخی موارد خاص به کار میآیند؛ برای مثال:
اگر میخواهید مسیرهای ویندوزی را روی یک ماشین یونیکسی دستکاری کنید (یا برعکس). هنگام اجرا در یونیکس، شما نمیتوانید از WindowsPath نمونهسازی کنید، اما میتوانید از PureWindowsPath نمونهسازی کنید.
شما میخواهید مطمئن شوید که کد شما فقط مسیرها را دستکاری میکند، بدون اینکه واقعاً به سیستمعامل دسترسی داشته باشد. در این حالت، نمونهسازی یکی از کلاسهای خالص میتواند مفید باشد، زیرا این کلاسها بهسادگی هیچ عملیاتی برای دسترسی به سیستمعامل ندارند.
همچنین ببینید
PEP 428: ماژول pathlib -- مسیرهای سامانه فایلبندیای شیءگرا.
همچنین ببینید
برای دستکاری سطح پایین رشتههای مسیر، میتوانید از ماژول os.path نیز استفاده کنید.
اشیای مسیر خالص، عملیات مدیریت مسیر را فراهم میکنند که در واقع به یک سیستم پرونده دسترسی ندارند. سه روش برای دسترسی به این کلاسها وجود دارد که به آنها گونهها (flavours) نیز میگوییم:
یک کلاس عام که نشاندهندهی سبک مسیر سیستم است (نمونهسازی از آن یک PurePosixPath یا PureWindowsPath ایجاد میکند):
>>> PurePath('setup.py')# Running on a Unix machinePurePosixPath('setup.py')
هر عنصر از pathsegments میتواند یا رشتهای باشد که یک قطعه مسیر را نشان میدهد، یا شیءای که رابط os.PathLike را پیادهسازی میکند و متد __fspath__() آن یک رشته برمیگرداند، مانند یک شیء مسیر دیگر:
اسلشهای اضافی و نقطههای تکی جمع میشوند، اما نقطههای دوتایی ('..') و دو اسلش آغازین ('//') جمع نمیشوند، زیرا این کار معنای مسیر را به دلایل مختلف (مانند پیوندهای نمادین، مسیرهای UNC) تغییر میدهد:
(رویکردی سادهلوحانه باعث میشود PurePosixPath('foo/../bar') معادل PurePosixPath('bar') شود، که اگر foo پیوندی نمادین به پوشهای دیگر باشد، اشتباه است)
اشیای مسیر خالص، رابط os.PathLike را پیادهسازی میکنند و میتوانند در هر جایی که این رابط پذیرفته شده باشد استفاده شوند.
تغییر یافته در نسخهی 3.6: پشتیبانی از رابط os.PathLike افزوده شد.
صرفنظر از سیستمی که روی آن اجرا میشوید، میتوانید همه این کلاسها را نمونهسازی کنید، زیرا آنها هیچ عملیاتی که فراخوانیهای سیستمی انجام دهد ارائه نمیکنند.
مسیرها تغییرناپذیر و هشپذیر هستند. مسیرهای همنوع قابل مقایسه و مرتبسازی هستند. این ویژگیها معناشناسی تبدیل حالت حروف (case-folding) آن نوع را رعایت میکنند:
مسیرهای با گونهای متفاوت، در مقایسه نابرابرند و نمیتوان آنها را مرتب کرد:
>>> PureWindowsPath('foo')==PurePosixPath('foo')False>>> PureWindowsPath('foo')<PurePosixPath('foo')Traceback (most recent call last):
File "<stdin>", line 1, in <module>TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
عملگر اسلش به ایجاد مسیرهای فرزند کمک میکند، مانند os.path.join(). اگر آرگومان یک مسیر مطلق باشد، مسیر قبلی نادیده گرفته میشود. در ویندوز، وقتی آرگومان یک مسیر نسبی ریشهدار باشد، درایو بازنشانی نمیشود (مثلاً r'\foo'):
نمایش رشتهای یک مسیر، خود مسیر خام سامانه فایلبندی است (به شکل بومی، مثلاً با بکاسلشها در ویندوز) که میتوانید آن را به هر تابعی که مسیر پرونده را بهعنوان یک رشته دریافت میکند، بدهید:
این رفتار مطابق با The Open Group Base Specifications Issue 6، بند 4.11 Pathname Resolution است:
«مسیری که با دو اسلش پشتسرهم آغاز میشود ممکن است بهصورت تعریفشده توسط پیادهسازی تفسیر شود، هرچند بیش از دو اسلش ابتدایی باید بهعنوان یک اسلش واحد در نظر گرفته شوند»
اگر میخواهید یک مسیر دلخواه در سامانه فایلبندی را به سمت بالا پیمایش کنید، توصیه میشود ابتدا Path.resolve() را فراخوانی کنید تا پیوندهای نمادین حل شوند و اجزای ".." حذف شوند.
بازگشت میدهد که آیا مسیر مطلق است یا نه. مسیر در صورتی مطلق در نظر گرفته میشود که هم دارای ریشه و هم (در صورتی که نوع (flavour) اجازه دهد) دارای درایو باشد:
الگوهایی که به "/**" ختم میشوند، همانطور که در مثال بالا دیدید، ممکن است هنگام ارسال به full_match تعجببرانگیز باشند. با اینکه "**" میتواند با صفر بخش مطابقت پیدا کند، اما ".../**" برای مطابقت به یک جداکننده نیاز دارد. از این رو، "/a/**" با مسیر "/a" مطابقت نمیکند. از آنجا که PurePath اسلشهای پایانی را حذف میکند، این الگو همچنین با "/a/" مطابقت ندارد.
این مسیر را با الگوی غیربازگشتی بهسبک glob ارائهشده تطبیق میدهد. اگر تطبیق موفقیتآمیز باشد، True و در غیر این صورت False برمیگرداند.
این متد مشابه full_match() است، اما الگوهای خالی مجاز نیستند (ValueError پرتاب میشود)، وایلدکارد بازگشتی "**" پشتیبانی نمیشود (مانند "*" غیربازگشتی عمل میکند)، و اگر یک الگوی نسبی ارائه شود، تطبیق از سمت راست انجام میشود:
نسخهای از این مسیر را نسبت به مسیری که other نشان میدهد محاسبه میکند. اگر ممکن نباشد، ValueError پرتاب میشود:
>>> p=PurePosixPath('/etc/passwd')>>> p.relative_to('/')PurePosixPath('etc/passwd')>>> p.relative_to('/etc')PurePosixPath('passwd')>>> p.relative_to('/usr')Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pathlib.py", line 941, in relative_toraiseValueError(error_message.format(str(self),str(formatted)))ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other is absolute.
وقتی walk_up نادرست است (پیشفرض)، مسیر باید با other شروع شود. وقتی آرگومان درست باشد، ممکن است ورودیهای .. برای تشکیل مسیر نسبی افزوده شوند. در تمام موارد دیگر، مانند مسیرهایی که به درایوهای مختلف ارجاع میدهند، ValueError پرتاب میشود.:
>>> p.relative_to('/usr',walk_up=True)PurePosixPath('../etc/passwd')>>> p.relative_to('foo',walk_up=True)Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pathlib.py", line 941, in relative_toraiseValueError(error_message.format(str(self),str(formatted)))ValueError: '/etc/passwd' is not on the same drive as 'foo' OR one path is relative and the other is absolute.
هشدار
این تابع بخشی از PurePath است و با رشتهها کار میکند. این تابع ساختار زیربنایی پرونده را بررسی نمیکند و به آن دسترسی ندارد. این موضوع میتواند بر گزینهی walk_up تأثیر بگذارد، زیرا فرض میکند هیچ پیوند نمادینی در مسیر وجود ندارد؛ در صورت نیاز، ابتدا resolve() را فراخوانی کنید تا پیوندهای نمادین حل شوند.
تغییر یافته در نسخهی 3.12: پارامتر walk_up افزوده شد (رفتار قدیمی همان walk_up=False است).
منسوخ شده از نسخهی 3.12، در نسخهی 3.14 حذف شده است: ارسال آرگومانهای جایگاهی اضافی منسوخ شده است؛ در صورت ارائه، آنها با other ادغام میشوند.
مسیر جدیدی با name تغییرکرده برمیگرداند. اگر مسیر اصلی نام نداشته باشد، ValueError پرتاب میشود:
>>> p=PureWindowsPath('c:/Downloads/pathlib.tar.gz')>>> p.with_name('setup.py')PureWindowsPath('c:/Downloads/setup.py')>>> p=PureWindowsPath('c:/')>>> p.with_name('setup.py')Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_nameraiseValueError("%r has an empty name"%(self,))ValueError: PureWindowsPath('c:/') has an empty name
یک مسیر جدید با stem تغییریافته برمیگرداند. اگر مسیر اصلی نام نداشته باشد، ValueError پرتاب میشود:
>>> p=PureWindowsPath('c:/Downloads/draft.txt')>>> p.with_stem('final')PureWindowsPath('c:/Downloads/final.txt')>>> p=PureWindowsPath('c:/Downloads/pathlib.tar.gz')>>> p.with_stem('lib')PureWindowsPath('c:/Downloads/lib.gz')>>> p=PureWindowsPath('c:/')>>> p.with_stem('')Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stemreturnself.with_name(stem+self.suffix)
File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_nameraiseValueError("%r has an empty name"%(self,))ValueError: PureWindowsPath('c:/') has an empty name
مسیر جدیدی برمیگرداند که suffix آن تغییر کرده است. اگر مسیر اصلی پسوند نداشته باشد، suffix جدید بهجای آن افزوده میشود. اگر suffix یک رشته خالی باشد، پسوند اصلی حذف میشود:
با ترکیب pathsegments دادهشده، یک شیء مسیر جدید از همان نوع ایجاد میکند. این متد هر زمان که یک مسیر مشتقشده ایجاد شود، فراخوانی میشود؛ مانند مسیرهای مشتقشده از parent و relative_to(). زیرکلاسها میتوانند این متد را بازنویسی کنند تا اطلاعات را به مسیرهای مشتقشده منتقل کنند، برای مثال:
مسیرهای ملموس، زیرکلاسهایی از کلاسهای مسیر خالص هستند. علاوه بر عملیات ارائهشده توسط آن کلاسها، متدهایی نیز برای انجام فراخوانیهای سیستمی روی اشیای مسیر فراهم میکنند. سه روش برای نمونهسازی مسیرهای ملموس وجود دارد:
شما فقط میتوانید نوع کلاسی را نمونهسازی کنید که با سیستم شما مطابقت دارد (اجازه دادن به فراخوانیهای سیستمی در انواع مسیر ناسازگار ممکن است به اشکالها یا شکستها در برنامه شما منجر شود):
>>> importos>>> os.name'posix'>>> Path('setup.py')PosixPath('setup.py')>>> PosixPath('setup.py')PosixPath('setup.py')>>> WindowsPath('setup.py')Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "pathlib.py", line 798, in __new__%(cls.__name__,))UnsupportedOperation: cannot instantiate 'WindowsPath' on your system
برخی متدهای مسیر عینی ممکن است در صورت شکست یک فراخوانی سیستمی، استثنای OSError را پرتاب کنند (برای مثال به این دلیل که مسیر وجود ندارد).
اگر URI با file: شروع نشود، یا مسیر تجزیهشده مطلق نباشد، ValueError پرتاب میشود.
اضافه شده در نسخهی 3.13.
تغییر یافته در نسخهی 3.14: اگر بخش authority در URL با نام میزبان محلی مطابقت داشته باشد، حذف میشود. در غیر این صورت، اگر authority خالی یا localhost نباشد، در ویندوز یک مسیر UNC برگردانده میشود (مانند قبل)، و در سایر پلتفرمها یک ValueError پرتاب میشود.
منسوخ شده از نسخهی 3.14, در نسخهی 3.19 حذف خواهد شد: فراخوانی این متد از PurePath بهجای Path امکانپذیر است، اما منسوخ است. استفادهی این متد از os.fsencode() آن را کاملاً ناخالص میکند.
یک شیء مسیر جدید را برمیگرداند که نشاندهندهی پوشهی خانهی کاربر است (همانطور که توسط os.path.expanduser() با ساختار ~ برگردانده میشود). اگر پوشهی خانه قابل تعیین نباشد، RuntimeError پرتاب میشود.
مسیر جدیدی با ساختارهای بسطیافتهی ~ و ~user برمیگرداند، همانطور که توسط os.path.expanduser() برگردانده میشود. اگر پوشهی خانه قابل تعیین نباشد، RuntimeError پرتاب میشود.
اگر مسیری وجود نداشته باشد یا یک حلقهی پیوند نمادین مشاهده شود، و strict برابر True باشد، OSError پرتاب میشود. اگر strict برابر False باشد، مسیر تا حد ممکن حل میشود و هر بخش باقیمانده بدون بررسی وجود آن، افزوده میشود.
تغییر یافته در نسخهی 3.6: پارامتر strict افزوده شد (رفتار پیش از 3.6 strict است).
تغییر یافته در نسخهی 3.13: با حلقههای پیوند نمادین مانند سایر خطاها برخورد میشود: در حالت سختگیرانه OSError پرتاب میشود و در حالت غیرسختگیرانه هیچ استثنایی پرتاب نمیشود. در نسخههای پیشین، RuntimeError صرفنظر از مقدار strict پرتاب میشد.
تغییر یافته در نسخهی 3.14: متدهای ذکرشده در بالا اکنون به جای پرتاب هیچگونه استثنای OSError از سوی سیستمعامل، False برمیگردانند. در نسخههای پیشین، برخی از انواع استثنای OSError پرتاب میشدند و برخی دیگر سرکوب میشدند. رفتار جدید با os.path.exists()، os.path.isdir() و غیره سازگار است. برای بازیابی وضعیت پرونده بدون سرکوب استثناها، از stat() استفاده کنید.
یک شیء os.stat_result حاوی اطلاعاتی درباره این مسیر، مانند os.stat() برمیگرداند. نتیجه در هر فراخوانی این متد جستجو میشود.
این متد معمولاً پیوندهای نمادین را دنبال میکند؛ برای گرفتن وضعیت (stat) یک پیوند نمادین، آرگومان follow_symlinks=False را اضافه کنید، یا از lstat() استفاده کنید.
اگر مسیر به یک پرونده یا پوشهی موجود اشاره کند، True را برمیگرداند و اگر مسیر نامعتبر، غیرقابلدسترسی یا مفقود باشد، False را برمیگرداند. برای تمایز بین این موارد از Path.stat() استفاده کنید.
این متد معمولاً پیوندهای نمادین را دنبال میکند؛ برای بررسی وجود یک پیوند نمادین، آرگومان follow_symlinks=False را اضافه کنید.
>>> Path('').exists()# The current directory.True>>> Path('.').exists()True>>> Path('setup.py').exists()True>>> Path('/etc').exists()True>>> Path('nonexistentfile').exists()False
تغییر یافته در نسخهی 3.12: پارامتر follow_symlinks افزوده شد.
اگر مسیر به یک پرونده معمولی اشاره کند، True برگردانده میشود. اگر مسیر نامعتبر باشد، در دسترس نباشد یا وجود نداشته باشد، یا به چیزی غیر از یک پرونده معمولی اشاره کند، False برگردانده میشود. برای تمایز بین این حالتها از Path.stat() استفاده کنید.
این متد معمولاً پیوندهای نمادین را دنبال میکند؛ برای مستثنی کردن پیوندهای نمادین، آرگومان follow_symlinks=False را اضافه کنید.
تغییر یافته در نسخهی 3.13: پارامتر follow_symlinks افزوده شد.
اگر مسیر به یک پوشه اشاره کند، True برگردانده میشود. اگر مسیر نامعتبر، دسترسیناپذیر یا وجود نداشته باشد، یا به چیزی غیر از یک پوشه اشاره کند، False برگردانده میشود. برای تمایز بین این موارد از Path.stat() استفاده کنید.
این متد معمولاً پیوندهای نمادین را دنبال میکند؛ برای مستثنی کردن پیوندهای نمادین به پوشهها، آرگومان follow_symlinks=False را اضافه کنید.
تغییر یافته در نسخهی 3.13: پارامتر follow_symlinks افزوده شد.
اگر مسیر به یک پیوند نمادین اشاره داشته باشد، True برگردانده میشود، حتی اگر آن پیوند نمادین شکسته باشد. اگر مسیر نامعتبر، غیرقابلدسترسی یا مفقود باشد، یا به چیزی غیر از یک پیوند نمادین اشاره داشته باشد، False برگردانده میشود. برای تمایز بین این موارد از Path.stat() استفاده کنید.
اگر مسیر به یک اتصال (junction) اشاره کند، True را برمیگرداند و برای هر نوع پرونده دیگری، False را برمیگرداند. در حال حاضر تنها ویندوز از اتصالها (junction) پشتیبانی میکند.
اگر مسیر یک نقطه سوارکردن (mount point) باشد، True را برمیگرداند: نقطهای در یک سامانه فایلبندی که سامانه فایلبندی متفاوتی در آن سوار شده است. در POSIX، تابع بررسی میکند که آیا والد path، یعنی path/..، روی دستگاه متفاوتی نسبت به path قرار دارد، یا آیا path/.. و path به همان آینود (i-node) روی همان دستگاه اشاره میکنند --- این باید نقاط سوارکردن را در همهی انواع Unix و POSIX تشخیص دهد. در Windows، یک نقطه سوارکردن بهعنوان ریشهی حرف درایو (مثلاً c:\)، اشتراک UNC (مثلاً \\server\share)، یا پوشهی یک سامانه فایلبندی سوارشده در نظر گرفته میشود.
اضافه شده در نسخهی 3.7.
تغییر یافته در نسخهی 3.12: پشتیبانی از ویندوز افزوده شد.
اگر مسیر به یک سوکت یونیکس (Unix socket) اشاره کند، True را برمیگرداند. اگر مسیر نامعتبر یا غیرقابلدسترسی باشد، یا وجود نداشته باشد، یا به چیزی غیر از یک سوکت یونیکس اشاره کند، False را برمیگرداند. برای تمایز بین این موارد از Path.stat() استفاده کنید.
اگر مسیر به یک FIFO اشاره کند، True برگردانده میشود. اگر مسیر نامعتبر، دسترسیناپذیر یا مفقود باشد، یا به چیزی غیر از FIFO اشاره کند، False برگردانده میشود. برای تمایز بین این حالتها از Path.stat() استفاده کنید.
اگر مسیر به یک دستگاه بلوکی اشاره کند، True برگردانده میشود. اگر مسیر نامعتبر یا غیرقابلدسترسی باشد یا وجود نداشته باشد، یا به چیزی جز یک دستگاه بلوکی اشاره کند، False برگردانده میشود. برای تمایز بین این موارد از Path.stat() استفاده کنید.
اگر مسیر به یک دستگاه نویسهای اشاره کند، True برمیگرداند. اگر مسیر نامعتبر، غیرقابلدسترسی یا وجود نداشته باشد، یا به چیزی جز یک دستگاه نویسهای اشاره کند، False برگردانده میشود. برای تمایز بین این حالتها از Path.stat() استفاده کنید.
برمیگرداند که آیا این مسیر به همان پروندهای اشاره میکند که other_path به آن اشاره میکند یا خیر؛ other_path میتواند یک شیء Path یا یک رشته باشد. معنای آن مشابه os.path.samefile() و os.path.samestat() است.
اگر به هر یک از دو پرونده به هر دلیلی نتوان دسترسی داشت، ممکن است یک OSError پرتاب شود.
یک شیء PathInfo که از پرسوجوی اطلاعات نوع پرونده پشتیبانی میکند. این شیء متدهایی را ارائه میدهد که نتایج خود را در نهانگاه ذخیره میکنند، که میتواند به کاهش تعداد فراخوانیهای سیستمی مورد نیاز هنگام تعیین نوع پرونده کمک کند. برای مثال:
اگر مسیر از Path.iterdir() ایجاد شده باشد، این ویژگی با اطلاعاتی دربارهی نوع پرونده که از پویش پوشهی والد بهدست آمده است، مقداردهی اولیه میشود. صرفاً دسترسی به Path.info هیچ پرسوجویی در سامانه فایلبندی انجام نمیدهد.
برای دریافت اطلاعات بهروز، بهتر است بهجای متدهای این ویژگی، Path.is_dir()، is_file() و is_symlink() را فراخوانی کنید. راهی برای بازنشانی نهانگاه وجود ندارد؛ در عوض میتوانید از طریق p=Path(p) یک شیء مسیر جدید با نهانگاه اطلاعات خالی ایجاد کنید.
فرزندان به ترتیب دلخواه برگردانده میشوند، و ورودیهای ویژه '.' و '..' گنجانده نمیشوند. اگر پس از ایجاد پیمایشگر، پروندهای از پوشه حذف یا به آن اضافه شود، نامشخص است که شیء مسیر برای آن پرونده گنجانده میشود یا خیر.
اگر مسیر پوشه نباشد یا به هر شکل دیگری دسترسیناپذیر باشد، OSError پرتاب میشود.
بهطور پیشفرض، یا زمانی که آرگومان فقط کلیدواژهای case_sensitive روی None تنظیم شده باشد، این متد مسیرها را با استفاده از قواعد مربوط به بزرگی و کوچکی حروفِ خاصِ پلتفرم مطابقت میدهد: معمولاً در POSIX حساس به بزرگی و کوچکی حروف، و در Windows غیرحساس به آن است. برای نادیده گرفتن این رفتار، case_sensitive را روی True یا False تنظیم کنید.
بهطور پیشفرض، یا زمانی که آرگومان فقط کلیدواژهای recurse_symlinks روی False تنظیم شده باشد، این متد پیوندهای نمادین را دنبال میکند، بهجز هنگام بسط وایلدکاردها "**". برای دنبال کردن همیشگی پیوندهای نمادین، recurse_symlinks را روی True تنظیم کنید.
نکته
هر استثنای OSError که از پویش سامانه فایلبندی پرتاب شود، مهار میشود. این شامل PermissionError هنگام دسترسی به پوشههای بدون اجازهی خواندن نیز میشود.
یک رویداد حسابرسیpathlib.Path.glob را با آرگومانهای self و pattern پرتاب میکند.
تغییر یافته در نسخهی 3.12: پارامتر case_sensitive افزوده شد.
تغییر یافته در نسخهی 3.13: پارامتر recurse_symlinks اضافه شد.
تغییر یافته در نسخهی 3.13: پارامتر pattern یک path-like object را میپذیرد.
تغییر یافته در نسخهی 3.13: تمام استثناهای OSError که هنگام پویش سامانه فایلبندی پرتاب میشوند، مهار میشوند. در نسخههای پیشین، چنین استثناهایی در بسیاری از موارد مهار میشدند، اما نه همه.
الگوی نسبیِ دادهشدهی pattern را بهصورت بازگشتی گلُب کنید. این کار مانند فراخوانی Path.glob() است که عبارت "**/" به ابتدای pattern افزوده شده باشد.
نکته
مسیرها بدون ترتیب خاصی بازگردانده میشوند. اگر به ترتیب خاصی نیاز دارید، نتایج را مرتب کنید.
نکته
هر استثنای OSError که از پویش سامانه فایلبندی پرتاب شود، مهار میشود. این شامل PermissionError هنگام دسترسی به پوشههای بدون اجازهی خواندن نیز میشود.
نام پروندهها را در یک درخت پوشه، با پیمایش درخت بهصورت بالا به پایین یا پایین به بالا، تولید میکند.
برای هر پوشه در درخت پوشهای که ریشهی آن self است (شامل self اما بدون '.' و '..')، این متد یک ۳-تایی از (dirpath,dirnames,filenames) تولید میکند.
dirpath یک Path به پوشهای است که در حال حاضر پیمایش میشود، dirnames فهرستی از رشتهها برای نامهای پوشههای فرعی در dirpath (به استثنای '.' و '..') است، و filenames فهرستی از رشتهها برای نامهای پروندههای غیرپوشهای در dirpath است. برای به دست آوردن یک مسیر کامل (که با self شروع میشود) به یک پرونده یا پوشه در dirpath، از dirpath/name استفاده کنید. اینکه فهرستها مرتبشده باشند یا نه، به سامانه فایلبندی وابسته است.
اگر آرگومان اختیاری top_down درست باشد (که پیشفرض است)، سهتایی مربوط به یک پوشه پیش از سهتاییهای مربوط به هر یک از زیرپوشههای آن تولید میشود (پوشهها بهصورت بالا به پایین پیمایش میشوند). اگر top_down نادرست باشد، سهتایی مربوط به یک پوشه پس از سهتاییهای مربوط به همهی زیرپوشههای آن تولید میشود (پوشهها بهصورت پایین به بالا پیمایش میشوند). صرفنظر از مقدار top_down، فهرست زیرپوشهها پیش از آنکه سهتاییهای مربوط به پوشه و زیرپوشههای آن پیمایش شوند، بازیابی میشود.
وقتی top_down true باشد، فراخوان میتواند فهرست dirnames را بهصورت درجا تغییر دهد (برای مثال، با استفاده از del یا انتساب اسلایسی)، و Path.walk() فقط به زیرپوشههایی که نام آنها در dirnames باقی مانده است، بهصورت بازگشتی وارد میشود. از این کار میتوان برای هرس جستجو، اعمال ترتیب مشخصی برای بازدید، یا حتی اطلاع دادن به Path.walk() در مورد پوشههایی استفاده کرد که فراخوان پیش از آنکه Path.walk() را دوباره از سر بگیرد، ایجاد یا تغییر نام میدهد. تغییر dirnames وقتی top_down false باشد، تأثیری بر رفتار Path.walk() ندارد، زیرا در لحظهای که dirnames به فراخوان تحویل داده میشود، پوشههای موجود در dirnames از قبل تولید شدهاند.
بهطور پیشفرض، خطاهای حاصل از os.scandir() نادیده گرفته میشوند. اگر آرگومان اختیاری on_error مشخص شده باشد، باید یک شیء فراخوانیپذیر باشد؛ این شیء با ۱ آرگومان فراخوانی میشود که یک نمونه از OSError است. شیء فراخوانیپذیر میتواند خطا را مدیریت کند تا پیمایش ادامه یابد یا آن را دوباره پرتاب کند تا پیمایش متوقف شود. توجه داشته باشید که نام پرونده بهعنوان ویژگی filename شیء استثنا در دسترس است.
بهطور پیشفرض، Path.walk() پیوندهای نمادین را دنبال نمیکند و در عوض آنها را به فهرست filenames اضافه میکند. follow_symlinks را روی مقدار درست تنظیم کنید تا پیوندهای نمادین حل شوند و متناسب با هدفهایشان در dirnames و filenames قرار بگیرند، و در نتیجه پوشههایی که پیوندهای نمادین به آنها اشاره دارند پیمایش شوند (در صورت پشتیبانی).
نکته
توجه داشته باشید که تنظیم follow_symlinks روی true میتواند منجر به بازگشت بینهایت شود، اگر پیوندی به پوشه والد خودش اشاره کند. Path.walk() پوشههایی را که از قبل بازدید کرده است پیگیری نمیکند.
نکته
Path.walk() فرض میکند پوشههایی که پیمایش میکند در حین اجرا تغییر داده نمیشوند. برای مثال، اگر پوشهای از dirnames با یک پیوند نمادین جایگزین شده باشد و follow_symlinks نادرست باشد، Path.walk() همچنان تلاش میکند وارد آن شود. برای جلوگیری از چنین رفتاری، در صورت لزوم پوشهها را از dirnames حذف کنید.
نکته
برخلاف os.walk()، Path.walk() در صورتی که follow_symlinks نادرست باشد، پیوندهای نمادین به پوشهها را در filenames فهرست میکند.
این مثال تعداد بایتهای استفادهشده توسط تمام پروندهها در هر پوشه را، در حالی که پوشههای __pycache__ نادیده گرفته میشوند، نمایش میدهد:
مثال بعدی یک پیادهسازی ساده از shutil.rmtree() است. پیمایش درخت بهصورت پایینبهبالا ضروری است، زیرا rmdir() اجازهی حذف یک پوشه را پیش از خالی شدن آن نمیدهد:
# Delete everything reachable from the directory "top".# CAUTION: This is dangerous! For example, if top == Path('/'),# it could delete all of your files.forroot,dirs,filesintop.walk(top_down=False):fornameinfiles:(root/name).unlink()fornameindirs:(root/name).rmdir()
پروندهای در این مسیر دادهشده ایجاد میکند. اگر mode داده شده باشد، با مقدار umask فرایند ترکیب میشود تا حالت پرونده و پرچمهای دسترسی تعیین شود. اگر پرونده از قبل وجود داشته باشد، هنگامی که exist_ok درست باشد، تابع موفق عمل میکند (و زمان تغییر آن به زمان فعلی بهروزرسانی میشود)، در غیر این صورت FileExistsError پرتاب میشود.
یک پوشه جدید در این مسیر دادهشده ایجاد میکند. اگر mode داده شود، با مقدار umask فرایند ترکیب میشود تا حالت پرونده و پرچمهای دسترسی را تعیین کند. اگر مسیر از قبل وجود داشته باشد، استثنای FileExistsError پرتاب میشود.
اگر parents درست باشد، هر والدِ موجودنشدهای از این مسیر در صورت نیاز ایجاد میشود؛ آنها با دسترسیهای پیشفرض ایجاد میشوند، بدون اینکه mode در نظر گرفته شود (با تقلید از دستور mkdir-p در POSIX).
اگر parent_mode برابر با None نباشد، هنگامی که parents برابر با true باشد، به عنوان حالت (mode) برای هر پوشهی سطح میانیِ تازهایجادشده استفاده میشود. مانند mode، این مقدار با مقدار umask فرایند ترکیب میشود. در غیر این صورت، پوشههای میانی با مجوزهای پیشفرض ایجاد میشوند (که آنها نیز مشمول umask هستند).
اگر parents نادرست باشد (پیشفرض)، نبودِ یک والد باعث پرتاب FileNotFoundError میشود.
اگر exist_ok نادرست باشد (پیشفرض)، در صورتی که پوشه هدف از قبل وجود داشته باشد، FileExistsError پرتاب میشود.
اگر exist_ok درست باشد، FileExistsError پرتاب نخواهد شد، مگر اینکه مسیر دادهشده از قبل در سامانه فایلبندی وجود داشته باشد و پوشه نباشد (مشابه رفتار دستور POSIX mkdir-p).
تغییر یافته در نسخهی 3.5: پارامتر exist_ok اضافه شد.
این مسیر را به یک پیوند نمادین اشارهکننده به target تبدیل کنید.
در ویندوز، یک پیوند نمادین (symlink) نشاندهنده یک پرونده یا یک پوشه است و بهصورت پویا به هدف تغییر شکل نمیدهد. اگر هدف وجود داشته باشد، نوع پیوند نمادین متناسب با هدف ایجاد میشود. در غیر این صورت، اگر target_is_directory برابر true باشد، پیوند نمادین بهعنوان پوشه ایجاد میشود؛ در غیر این صورت پیوند نمادین پرونده (حالت پیشفرض) ایجاد خواهد شد. در پلتفرمهای غیر ویندوزی، target_is_directory نادیده گرفته میشود.
این پرونده یا درخت پوشه را به target دادهشده کپی میکند و نمونهای جدید از Path را که به target اشاره میکند، برمیگرداند.
اگر منبع یک پرونده باشد، مقصد در صورتی که پرونده موجودی باشد، جایگزین میشود. اگر منبع یک پیوند نمادین باشد و follow_symlinks برابر true باشد (پیشفرض)، هدف پیوند نمادین کپی میشود. در غیر این صورت، پیوند نمادین در مقصد دوباره ایجاد میشود.
اگر preserve_metadata برابر false باشد (پیشفرض)، تضمین میشود که فقط ساختارهای پوشهها و دادههای پرونده کپی شوند. برای اطمینان از اینکه مجوزهای پرونده و پوشه، پرچمها، زمانهای آخرین دسترسی و تغییر، و ویژگیهای توسعهیافته در صورت پشتیبانی کپی شوند، preserve_metadata را روی true تنظیم کنید. این آرگومان هنگام کپی کردن پروندهها در ویندوز (که فراداده همیشه حفظ میشود) هیچ تأثیری ندارد.
نکته
در صورتی که سیستمعامل و سامانه فایلبندی پشتیبانی کنند، این متد یک کپی سبکوزن انجام میدهد، به طوری که بلوکهای داده فقط زمانی کپی میشوند که تغییر یابند. این بهعنوان کپی در زمان نوشتن (copy-on-write) شناخته میشود.
این پرونده یا درخت پوشه را در target_dir دادهشده کپی میکند، که باید پوشهای موجود باشد. سایر آرگومانها دقیقاً مانند Path.copy() پردازش میشوند. یک نمونهی جدید از Path برمیگرداند که به کپی اشاره میکند.
نام این پرونده یا پوشه را به target دادهشده تغییر میدهد و یک نمونه جدید از Path را برمیگرداند که به target اشاره میکند. در یونیکس، اگر target وجود داشته باشد و پرونده باشد، در صورتی که کاربر اجازه داشته باشد، بدون پیام جایگزین میشود. در ویندوز، اگر target وجود داشته باشد، FileExistsError پرتاب میشود. target میتواند یک رشته یا یک شیء مسیر دیگر باشد:
نام این پرونده یا پوشه را به target دادهشده تغییر میدهد و نمونهای جدید از Path برمیگرداند که به target اشاره میکند. اگر target به یک پرونده موجود یا پوشه خالی اشاره کند، بدون قید و شرط جایگزین میشود.
مسیر هدف میتواند مطلق یا نسبی باشد. مسیرهای نسبی نسبت به پوشهی کاری جاری تفسیر میشوند، نه پوشهی شیء Path.
تغییر یافته در نسخهی 3.8: مقدار بازگشتی افزوده شد، نمونهی جدید Path را برمیگرداند.
این پرونده یا درخت پوشه را به target دادهشده منتقل میکند و یک نمونهی جدید از Path را برمیگرداند که به target اشاره میکند.
اگر target وجود نداشته باشد، ایجاد میشود. اگر هم این مسیر و هم target پروندههای موجود باشند، آنگاه مقصد بازنویسی میشود. اگر هر دو مسیر به یک پرونده یا پوشه اشاره کنند، یا target یک پوشهی غیرخالی باشد، OSError پرتاب میشود.
اگر هر دو مسیر روی یک سامانه فایلبندی باشند، جابهجایی با os.replace() انجام میشود. در غیر این صورت، این مسیر (با حفظ فراداده و پیوندهای نمادین) کپی و سپس حذف میشود.
این پرونده یا درخت پوشه را به target_dir دادهشده منتقل میکند، که باید یک پوشه موجود باشد. یک نمونه جدید Path را برمیگرداند که به مسیر منتقلشده اشاره میکند.
حالت و مجوزهای پرونده را تغییر میدهد، مانند os.chmod().
این متد معمولاً پیوندهای نمادین را دنبال میکند. برخی از نسخههای یونیکس از تغییر مجوزها روی خود پیوند نمادین پشتیبانی میکنند؛ در این پلتفرمها میتوانید آرگومان follow_symlinks=False را اضافه کنید، یا از lchmod() استفاده کنید.
با هر تعداد بخش پرونده یا پوشه، از جمله صفر، مطابقت میکند. توجه داشته باشید که در full_match()، عبارت "a/**" با "a" مطابقت نمیکند، در حالی که glob() برای آن الگو "a" را نتیجه میدهد.
* (کل بخش)
با یک بخش پرونده یا پوشه مطابقت دارد.
* (بخشی از یک بخش)
با هر تعداد نویسهی غیرجداکننده، از جمله صفر، مطابقت میکند.
?
با یک نویسهی غیرجداکننده تطابق دارد.
[seq]
با یک نویسه در seq مطابقت دارد، که در آن seq دنبالهای از نویسههاست. از عبارتهای بازه پشتیبانی میشود؛ برای مثال، [a-z] با هر حرف کوچک ASCII مطابقت دارد. میتوان چند بازه را ترکیب کرد: [a-zA-Z0-9_] با هر حرف، رقم یا زیرخط ASCII مطابقت دارد.
[!seq]
با یک نویسه خارج از seq مطابقت میکند؛ seq از همان قوانین بالا پیروی میکند.
برای تطبیق لفظی، فرانویسههارا در کروشه قرار دهید. برای مثال، "[?]" با نویسهی "?" مطابقت دارد.
وایلدکارد ** امکان تطبیق الگوی بازگشتی (recursive globbing) را فراهم میکند. چند نمونه:
الگو
معنی
**/*
هر مسیری که دستکم یک بخش داشته باشد.
**/*.py
هر مسیری که بخش پایانی آن به .py ختم میشود.
assets/**
هر مسیری که با «assets/» آغاز شود.
assets/**/*
هر مسیری که با "assets/" آغاز میشود، بهجز خود "assets/".
نکته
تطبیق الگو (globbing) با وایلدکارد «**» تمام پوشههای درخت را بازدید میکند. جستجو در درختهای پوشهای بزرگ ممکن است زمان زیادی ببرد.
تغییر یافته در نسخهی 3.13: تطبیق الگو با الگویی که به «**» ختم میشود، هم پروندهها و هم پوشهها را برمیگرداند. در نسخههای پیشین، فقط پوشهها برگردانده میشدند.
در Path.glob() و rglob()، میتوان یک اسلش پایانی به الگو اضافه کرد تا فقط با پوشهها مطابقت کند.
تغییر یافته در نسخهی 3.11: تطبیق الگو با الگویی که به یک جداکنندهی اجزای مسیر (sep یا altsep) ختم میشود، فقط پوشهها را برمیگرداند.
پروندههایی که با یک نقطه آغاز میشوند، در pathlib ویژه نیستند. این مانند فرستادن include_hidden=True به glob.glob() است.
در pathlib، کامپوننتهای الگوی «**» همیشه بازگشتی هستند. این مانند ارسال recursive=True به glob.glob() است.
در pathlib، کامپوننتهای الگوی «**» بهطور پیشفرض پیوندهای نمادین را دنبال نمیکنند. این رفتار معادلی در glob.glob() ندارد، اما میتوانید برای رفتار سازگار، recurse_symlinks=True را به Path.glob() ارسال کنید.
مقادیر برگرداندهشده از path.glob() و path.rglob() در pathlib، برخلاف نتایج glob.glob(root_dir=path)، شامل مسیر بهعنوان پیشوند هستند.
مقادیر برگرداندهشده از path.glob() و path.rglob() در pathlib ممکن است شامل خود path باشند، برای مثال هنگام تطبیق الگو با «**»، در حالی که نتایج glob.glob(root_dir=path) هرگز شامل رشته خالیای که متناظر با path باشد، نمیشوند.
pathlib عملیات مسیر را با استفاده از اشیای PurePath و Path پیادهسازی میکند و بنابراین به آن شیءگرا گفته میشود. از سوی دیگر، ماژولهای os و os.path توابعی ارائه میدهند که با اشیای سطح پایین str و bytes کار میکنند، که رویکردی رویهایتر است. برخی کاربران سبک شیءگرا را خواناتر میدانند.
انواع str و bytes پایتون، و بخشهایی از ماژولهای os و os.path، به زبان C نوشته شدهاند و بسیار سریع هستند. pathlib به زبان پایتون خالص نوشته شده است و اغلب کندتر است، اما بهندرت آنقدر کند است که اهمیت داشته باشد.
نرمالسازی مسیر در pathlib کمی سختگیرانهتر و سازگارتر از os.path است. برای مثال، در حالی که os.path.abspath() بخشهای ".." را از یک مسیر حذف میکند، که ممکن است اگر پیوندهای نمادین دخیل باشند، معنای مسیر را تغییر دهد، Path.absolute() این بخشها را برای ایمنی بیشتر حفظ میکند.
نرمالسازی مسیر در pathlib ممکن است آن را برای برخی کاربردها نامناسب کند:
pathlib Path("my_folder/") را به Path("my_folder") عادیسازی میکند، که این کار معنای مسیر را هنگام ارائه به APIهای مختلف سیستمعامل و ابزارهای خط فرمان تغییر میدهد. بهطور مشخص، نبود یک جداکننده انتهایی ممکن است باعث شود مسیر بهعنوان یک پرونده یا پوشه تفسیر شود، نه فقط بهعنوان یک پوشه.
pathlib Path("./my_program") را به Path("my_program") عادیسازی میکند، که این کار معنای یک مسیر را هنگام استفاده بهعنوان مسیر جستجوی پروندههای اجرایی، مانند استفاده در پوسته یا هنگام ایجاد یک فرایند فرزند، تغییر میدهد. بهطور مشخص، نبود یک جداکننده در مسیر ممکن است باعث شود که آن مسیر بهجای پوشه جاری در PATH جستجو شود.
در نتیجهی این تفاوتها، pathlib جایگزینی بینیاز از تغییر (drop-in replacement) برای os.path نیست.
اگر مسیر یک پوشه یا یک پیوند نمادین به یک پوشه باشد، True را برمیگرداند؛ اگر مسیر هر نوع پرونده دیگری باشد (یا به آن اشاره کند)، یا وجود نداشته باشد، False را برمیگرداند.
اگر follow_symlinks برابر False باشد، تنها در صورتی True را برمیگرداند که مسیر یک پوشه باشد (بدون دنبال کردن پیوندهای نمادین)؛ اگر مسیر هر نوع پرونده دیگری باشد یا وجود نداشته باشد، False را برمیگرداند.
اگر مسیر یک پرونده یا پیوند نمادینی باشد که به یک پرونده اشاره میکند، True را برمیگرداند؛ اگر مسیر یک پوشه باشد (یا به یک پوشه اشاره کند) یا هر چیز دیگری غیر از پرونده باشد، یا اگر وجود نداشته باشد، False را برمیگرداند.
اگر follow_symlinks برابر False باشد، تنها در صورتی True را برمیگرداند که مسیر یک پرونده باشد (بدون دنبال کردن پیوندهای نمادین)؛ اگر مسیر یک پوشه یا غیرفایل دیگر باشد، یا وجود نداشته باشد، False را برمیگرداند.
اگر مسیر یک پیوند نمادین باشد (حتی اگر شکسته باشد)، True را برمیگرداند؛ اگر مسیر یک پوشه یا هر نوع پرونده باشد، یا وجود نداشته باشد، False را برمیگرداند.
آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC).
آیا اشکالی یافتید؟
ساخته شده با Sphinx 9.1.0.
You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.