درس ۱۱: کتابخانه استاندارد پایتون¶

Photo by Yousef Espanioly¶
کتابخانه استاندارد پایتون مجموعه وسیعی از امکانات آماده است که با نصب بسته نرمافزاری پایتون (درس دوم) در اختیار قرار میگیرد. تمام تابعها و ماژولهایی که تاکنون با آن آشنا شدهایم، بخشی از این کتابخانه هستند. فهرست کامل ابزارهای ارایه شده توسط این کتابخانه را میتوانید از نشانی [The Python Standard Library] مشاهده نمایید.
لازم به یادآوری است که بخشی بزرگی از قدرت پایتون به دلیل وجود کتابخانههای فراوان و قدرتمند آن است که تعداد زیادی از آنها خارج کتابخانه استاندارد پایتون و درون جامعه کاربری در حال توسعه هستند که فهرست تقریبا کاملی از آنها نیز توسط PyPI قابل جستجو و دریافت هستند.
این درس به عنوان آخرین درس از سطح مقدماتی کتاب به بررسی بخشی از امکانهای کاربردی این کتابخانه اختصاص یافته است که البته ممکن است در طول درسهای گذشته از آنها استفاده کرده باشیم!. پیشتر کمی با ماژول sys
آشنا شدهایم، در این درس به بررسی سه ماژول کاربردی دیگر خواهیم پرداخت. ماژولهای مهم دیگری نیز طی دروس آینده بررسی خواهند شد (مانند: re
و datetime
).
✔ سطح: مقدماتی
math¶
این ماژول حاوی ثابتها (Constants) و تابعهای ریاضی است [اسناد پایتون] که برخی از آنها به شرح پایین است:
math.pi
: ثابتی حاوی عدد π (ویکیپدیا) است [اسناد پایتون]:>>> import math >>> math.pi 3.141592653589793 >>>
math.e
: ثابتی حاوی عدد e (ویکیپدیا) است [اسناد پایتون]:>>> import math >>> math.e 2.718281828459045 >>>
math.inf
: (از نسخه 3.5 به بعد) - ثابتی حاوی مقدار مثبت بینهایت (Positive infinity) است که این مقدار برابر با خروجی تابع('float('inf
میباشد.math.inf -
نیز برابر منفی بینهایت است [اسناد پایتون].برای بررسی inf بودن (مثبت یا منفی) از تابع
(math.isinf(x
[اسناد پایتون] استفاده میشود:>>> import math >>> a = math.inf >>> b = 10 >>> a > b True >>> math.inf + math.inf inf >>> 1 / math.inf 0.0 >>> math.inf / 2 inf >>> 3 * math.inf inf >>> -3 * math.inf -inf >>> math.isinf(a) True >>> math.isinf(b) False >>>
math.nan
: از نسخه 3.5 به بعد - ثابتی حاوی مقدار «تعریف نشده» یا NaN - اختصار Not a Number (ویکیپدیا) - میباشد که این مقدار برابر با خروجی تابع('float('nan
است [اسناد پایتون].برای بررسی nan بودن از تابع
(math.isnan(x
[اسناد پایتون] استفاده میشود:>>> import math >>> a = math.nan >>> a nan >>> 0 * math.inf nan >>> math.inf - math.inf nan >>> math.isnan(a) True >>>
(math.ceil(x
: کوچکترین عدد صحیحی که بزرگتر یا مساوی با عددx
باشد را برمیگرداند [اسناد پایتون]:>>> import math >>> math.ceil(4) 4 >>> math.ceil(-4.17) -4 >>> math.ceil(4.17) 5 >>>
(math.floor(x
: بزرگترین عدد صحیحی که کوچکتر یا مساوی با عددx
باشد را برمیگرداند [اسناد پایتون]:>>> import math >>> math.floor(4) 4 >>> math.floor(-4.17) -5 >>> math.floor(4.17) 4 >>>
(math.fabs(x
: همانند تابع آماده()abs
[اسناد پایتون] مقدار قدر مطلق (ویکیپدیا) عددx
را برمیگرداند [اسناد پایتون].
تابع آماده
abs
بدون نیاز به import همواره قابل استفاده است و خروجی آن بر اساس نوع داده ورودی میتواند صحیح یا ممیز شناور باشد. ولی تابع(math.fabs(x
برای کار با داده های float طراحی شده است و خروجی آن همواره یک عدد ممیز شناور است:>>> import math >>> math.fabs(-4.17) 4.17 >>> math.fabs(-4) 4.0 >>> math.fabs(4) 4.0 >>>
(math.factorial(x
: مقدار فاکتوریل (ویکیپدیا) عدد x را برمیگرداند [اسناد پایتون]:>>> import math >>> math.factorial(5) 120 >>>
(math.exp(x
: حاصلe**x
(ویکیپدیا) را برمیگرداند [اسناد پایتون]:>>> import math >>> math.exp(3) 20.085536923187668 >>>
(math.log(x[, base]
: حاصل لگاریتم (Logarithm) عدد x در پایه base را برمیگرداند؛ آرگومان base اختیاری است و چنانچه ذکر نگردد به صورت پیشفرض حاصل لگاریتم عدد x در پایه عدد e یا همان لگاریتم طبیعی (ویکیپدیا) برگردانده میشود [اسناد پایتون]:>>> import math >>> math.log(math.e) # ln e == 1 1.0 >>> math.log(1) # ln 1 == 0 0.0 >>>
>>> math.log(8, 2) # 2**3 == 8 3.0 >>> math.log(100, 10) # 10**2 == 100 2.0 >>> math.log(81, 3) # 3**4 == 81 4.0 >>> math.log(2, 10) 0.30102999566398114 >>>
برای سادگی استفاده در محاسبههای ریاضی دو تابع
(log10(x
[اسناد پایتون] - محاسبه لگاریتم عدد x در پایه عدد 10 - و(log2(x
[اسناد پایتون] - محاسبه لگاریتم عدد x در پایه عدد 2؛ که از نسخه 3.3 به بعد اضافه شده است - نیز در دسترس هستند:>>> math.log10(100) 2.0 >>> math.log2(8) 3.0 >>>
(math.sqrt(x
: ریشه دوم (Square root) یا همان جذر (ویکیپدیا) عدد x را برمیگرداند [اسناد پایتون]:>>> import math >>> math.sqrt(4) 2.0 >>>
(math.pow(x, y
: عدد x را به توان عدد y میرساند و حاصل را برمیگرداند [اسناد پایتون]:>>> import math >>> math.pow(3, 2) 9.0
این تابع هر دو آرگومان خود را به نوع float تبدیل میکند؛ چنانچه میخواهید با اعداد صحیح کار کنید، از عملگر
**
یا تابع آماده()pow
[اسناد پایتون] استفاده نمایید:>>> 3**2 9 >>> pow(3, 2) 9
توابع مثلثاتی (Trigonometric functions) [اسناد پایتون]:
(cos(x
و(sin(x
و(tan(x
و(acos(x
و(asin(x
و(atan(x
که در تمام آنها زاویه x بر حسب رادیان (Radian) است:>>> import math >>> math.cos(0) 1.0 >>> math.sin(0) 0.0 >>> math.tan(0) 0.0 >>>
(math.degrees(x
: زاویه x را از رادیان به درجه تبدیل میکند [اسناد پایتون]:>>> import math >>> math.degrees(0) 0.0
(math.radians(x
: زاویه x را از درجه به رادیان تبدیل میکند [اسناد پایتون]:>>> import math >>> math.degrees(0) 0.0 >>> math.radians(30) 0.5235987755982988
>>> math.sin(math.radians(90)) 1.0
توابع هذلولی (Hyperbolic functions) [اسناد پایتون]:
(cosh(x
و(sinh(x
و(tanh(x
و(acosh(x
و(asinh(x
و(atanh(x
.
os¶
این ماژول امکان استفاده از برخی قابلیتهای وابسته به سیستم عامل را فراهم میآورد؛ مانند گرفتن مسیر دایرکتوری برنامه [اسناد پایتون]. برخی از تابعهای موجود در این ماژول به شرح پایین است:
os.environ
: یک شی از نوع نگاشت - مانند نوع دیکشنری [به درس هشتم رجوع شود] - است که حاوی متغیرهای محیطی سیستم عامل میباشد [اسناد پایتون]باید توجه داشت که مقدار این دستور متناسب با لحظهای از سیستم عامل است که ماژول
os
به اسکریپت import شده است و شامل متغیرهایی که پس از این لحظه ایجاد شده باشند نمیشود.>>> # Python 3.x, GNU/Linux >>> import os >>> os.environ environ({'LOGNAME': 'saeid', 'PWD': '/home/saeid', '_': '/usr/bin/python3', 'LANG': 'en_US.UTF-8', 'PATH': '/usr/local/sbin:/usr/local/bin:/usr/bin', 'ZSH': '/home/saeid/.oh-my-zsh'}) >>>
>>> os.environ['PATH'] '/usr/local/sbin:/usr/local/bin:/usr/bin' >>> os.environ['LANG'] 'en_US.UTF-8'
()os.getcwd
: مسیر دایرکتوری جاری (Current Working Directory) را برمیگرداند. خروجی این تابع برابر با دستورpwd
در خط فرمان گنولینوکس یا%echo %CD
در خط فرمان ویندوز میباشد. [اسناد پایتون]:# Python 3.x, GNU/Linux ~ pwd /home/saeid
~ python3 -q >>> import os >>> os.getcwd() '/home/saeid' >>>
(os.chdir(path
: مسیر دایرکتوری جاری را به مسیر آرگومان دریافتی path تغییر میدهد. عملکرد این تابع برابر با دستورcd
در خط فرمانهای گنولینوکس و ویندوز است. [اسناد پایتون]:>>> import os >>> os.getcwd() '/home/saeid' >>> os.chdir('/etc') >>> os.getcwd() '/etc'
(os.listdir(path
: یک شی لیست که شامل محتویات درون دایرکتوری path است را برمیگرداند. چنانچه آرگومان path ارسال نشود به صورت پیشفرض مسیر دایرکتوری جاری در نظر گرفته میشود. [اسناد پایتون]>>> import os >>> os.listdir('/home/saeid/Pictures') ['scan0001.jpg', 'smplayer_screenshots', 'GNU.png', 'Wallpapers']
(os.mkdir(path
: یک دایرکتوری که نام کامل آن توسط آرگومان path تعیین شده است را ایجاد میکند. در صورتی که این دایرکتوری از قبل موجود باشد یک استثناFileExistsError
رخ میدهد. [اسناد پایتون]:>>> import os >>> os.mkdir('dir1')
در نمونه کد بالا از آنجا که مسیر دایرکتوری ذکر نشده است؛ دایرکتوری dir1 به صورت پبش فرض در مسیر دایرکتوری جاری (که در اینجا:
/home/saeid/
است) ایجاد میگردد؛ همین امر باعث بروز استثنا با اجرای دستور پایین میشود:>>> os.mkdir('/home/saeid/dir1') Traceback (most recent call last): File "<stdin>", line 1, in <module> FileExistsError: [Errno 17] File exists: '/home/saeid/dir1'
>>> os.mkdir('/home/saeid/Documents/dir2')
نمونه کد بالا موجب ایجاد دایرکتوری dir2 درون مسیر دایرکتوری Documents میشود.
مسیر دایرکتوری میبایست به صورت صحیح وارد شود؛ در نمونه کد پایین نیز به همین دلیل که دایرکتوری dir3 وجود ندارد، استثنایی رخ داده است.
>>> os.mkdir('/home/saeid/Documents/dir3/dir4') Traceback (most recent call last): File "<stdin>", line 1, in <module> FileNotFoundError: [Errno 2] No such file or directory: '/home/saeid/Documents/dir3/dir4'
(os.makedirs(path
: همانند(os.mkdir(path
است ولی با این تفاوت که تمامی دایرکتوریهای میانی مورد نیاز را هم ایجاد میکند. [اسناد پایتون]در نمونه کد پایین برای ایجاد دایرکتوری dir5 دایرکتوریهای dir3 و dir4 - که البته وجود ندارند - نیز ایجاد میگردند.
>>> import os >>> os.makedirs('/home/saeid/Documents/dir3/dir4/dir5')
(os.rmdir(path
: دایرکتوری مشخص شده توسط آرگومان path را حذف میکند. این دایرکتوری میبایست خالی باشد در غیر این صورت یک استثناOSError
رخ میدهد. [اسناد پایتون]البته برای حذف کامل یک دایرکتوری به همراه تمام محتویات آن میتوانید از تابع
(rmtree(path
درون ماژولshutil
[اسناد پایتون] استفاده نمایید:>>> import shutil >>> shutil.rmtree("/home/saeid/Documents/dir1")
(os.removedirs(path
: همانند(os.rmdir(path
است ولی با این تفاوت که عملکردی بازگشتی دارد و تا زمانی که خطایی رخ نداده دایرکتوریهای مشخص شده در آرگومان path را یکی یکی حذف میکند. [اسناد پایتون]>>> import os >>> os.removedirs('/home/dir1/dir2/dir3')
در نمونه کد بالا ابتدا دایرکتوری dir3 (با مسیر
'home/dir1/dir2/dir3/'
) حذف میشود - البته اگر خالی باشد - و بعد از آن برای حذف دایرکتوری dir2 (با مسیر'home/dir1/dir2/'
) تلاش میشود که اگر آنهم خالی باشد و حذف گردد، روند حذف به همین شکل برای باقی مسیر ادامه مییابد.(os.rename(src, dst
: این تابع برای تغییر نام یک فایل یا دایرکتوری کاربرد دارد. آرگومانsrc
نام اصلی و آرگومانdst
نیز نام جدید برای فایل یا دایرکتوری مورد نظر میباشند [اسناد پایتون]:>>> import os >>> os.getcwd() '/home/saeid/Documents/dir' >>> os.listdir(os.getcwd()) ['fontsdir', 'index.html', 'style.css'] >>> os.rename("fontsdir", "_fonts") >>> os.listdir(os.getcwd()) ['index.html', 'style.css', '_fonts']
توجه داشته باشید چنانچه فایل یا دایرکتوری موردنظر در مسیری دیگری از مسیر دایرکتوری جاری باشد؛ لازم است نام به شکل کامل (همراه با مسیر) ذکر گردد. همچنین بدیهی است که تغییر مسیر در آرگومان
dst
موجب عمل انتقال (Move) میشود:>>> import os >>> os.getcwd() '/home/saeid/Documents/dir/dir1' >>> os.listdir(os.getcwd()) ['index.html', 'style.css', '_fonts'] >>> os.rename("_fonts", "/home/saeid/Documents/dir/dir2/_fonts") >>> os.listdir(os.getcwd()) ['index.html', 'style.css'] >>> os.chdir('/home/saeid/Documents/dir/dir2') >>> os.listdir(os.getcwd()) ['_fonts']
در گنولینوکس چنانچه بخواهیم نام فایلی به یک نام از پیش موجود تغییر داده شود؛ [در صورتی که کاربر نیز اجازه دسترسی (Permission) لازم را داشته باشد] یک عمل جایگزینی (Replace) صورت میگیرد، ولی برای چنین مواقعی در سیستم عامل ویندوز یک خطای
OSError
رخ خواهد داد. رویداد این ماجرا در هنگام تغییر نام یک دایرکتوری، باعث بروز خطایOSError
در هر دو سیستم عامل میشود.(os.renames(old, new
: عملکردی مشابه با تابع()rename
دارد با این تفاوت که اگر دایرکتورهای میانی از مسیر آرگومانnew
، وجود نداشته باشند، آنها را نیز ایجاد میکند [اسناد پایتون]:>>> import os >>> os.getcwd() '/home/saeid/Documents/dir' >>> os.listdir(os.getcwd()) ['index.html', 'style.css', '_fonts', 'js'] >>> os.renames("style.css", "css/style.css") >>> os.listdir(os.getcwd()) ['index.html', 'css', '_fonts', 'js']
(os.walk(rootdirpath
: مسیر یک دایرکتوری را به عنوان دایرکتوری ریشه پیمایش میکند و مسیر هر دایرکتوری را که میبیند به همراه نام دایرکتوریها و فایلهای درون آن برمیگرداند. [اسناد پایتون]:dir1 ├── dir2 │ └── file21 ├── file11 └── file12
>>> import os >>> tuple(os.walk('/home/saeid/Documents/dir1')) (('/home/saeid/Documents/dir1', ['dir2'], ['file12', 'file11']), ('/home/saeid/Documents/dir1/dir2', [], ['file21']))
>>> import os >>> for root, dirs, files in os.walk('/home/saeid/Documents/dir1'): ... print('Found directory: {}'.format(root)) ... for filename in files: ... print('\t{}'.format(filename)) ... Found directory: /home/saeid/Documents/dir1 file12 file11 Found directory: /home/saeid/Documents/dir1/dir2 file21 >>>
جهت پیمایش دایرکتوریها به صورت پیشفرض از بالا (دایرکتوری ریشه) به پایین است که میتوان با
False
قرار دادن آرگومان اختیاریtopdown
آن را معکوس نمود:>>> for root, dirs, files in os.walk('/home/saeid/Documents/dir1', topdown=False): ... print('Found directory: {}'.format(root)) ... for filename in files: ... print('\t{}'.format(filename)) ... Found directory: /home/saeid/Documents/dir1/dir2 file21 Found directory: /home/saeid/Documents/dir1 file12 file11 >>>
os.sep
: این متغیر حاوی کاراکتری میباشد که سیستمعامل از آن برای جدا سازی اجزای یک مسیر استفاده میکند. مانند:/
در گنولینوکس یا\\
در ویندوز [اسناد پایتون]os.extsep
: این متغیر حاوی کاراکتری میباشد که در سیستمعامل جاری از آن برای جدا سازی نام فایل از پسوند آن استفاده میگردد. مانند:.
(نام فایل: script.py) [اسناد پایتون]os.pardir
: حاوی مقداری است که در سیستمعامل جاری از آن برای اشاره به یک دایرکتوری بالاتر از دایرکتوری جاری استفاده میگردد (Parent Directory). مانند:..
در گنولینوکس و ویندوز [اسناد پایتون]:# GNU/Linux ~ pwd /home/saeid/Documents ~ cd .. ~ pwd /home/saeid
os.curdir
: حاوی مقداری است که در سیستمعامل جاری از آن برای اشاره به دایرکتوری جاری استفاده میگردد (Current Directory). مانند:.
در گنولینوکس و ویندوز [اسناد پایتون]:# GNU/Linux ~ pwd /home/saeid ~ cd . ~ pwd /home/saeid ~ cd ./.. ~ pwd /home
os.path¶
این ماژول توابعی مفیدی برای کار با مسیر فایلها و دایرکتوریها پیادهسازی کرده است [اسناد پایتون].
ملاحظه
برای خواندن و نوشتن فایلها از ()open
و برای دسترسی به سیستمفایل از ماژول os
استفاده نمایید.
(os.path.split(path
: مسیر path دریافتی را به یک توپِل (dirname, basename) تجزیه میکند که در آن basename آخرین بخش از مسیر path و dirname نیز هر آنچه قبل از basename باشد، خواهند بود [اسناد پایتون]:>>> import os.path >>> for path in [ '/one/two/three', ... '/one/two/three/', ... '/', ... '.', ... '']: ... print ('"%s" : "%s"' % (path, os.path.split(path))) ... "/one/two/three" : "('/one/two', 'three')" "/one/two/three/" : "('/one/two/three', '')" "/" : "('/', '')" "." : "('', '.')" "" : "('', '')" >>>
(os.path.basename(path
: مقداری برابر با بخش دوم از توپِل خروجی تابع(os.path.split(path
را برمیگرداند [اسناد پایتون]:>>> import os.path >>> >>> for path in [ '/one/two/three', ... '/one/two/three/', ... '/', ... '.', ... '']: ... print ('"%s" : "%s"' % (path, os.path.basename(path))) ... "/one/two/three" : "three" "/one/two/three/" : "" "/" : "" "." : "." "" : "" >>>
(os.path.dirname(path
: مقداری برابر با بخش یکم از توپِل خروجی تابع(os.path.split(path
را برمیگرداند [اسناد پایتون]:>>> import os.path >>> >>> for path in [ '/one/two/three', ... '/one/two/three/', ... '/', ... '.', ... '']: ... print ('"%s" : "%s"' % (path, os.path.dirname(path))) ... "/one/two/three" : "/one/two" "/one/two/three/" : "/one/two/three" "/" : "/" "." : "" "" : "" >>>
(os.path.splitext(path
: مشابه تابع(os.path.split(path
است با این تفاوت که پسوند را از path جدا کرده و نتیجه را به شکل توپِل بر میگرداند [اسناد پایتون]:>>> import os.path >>> >>> for path in [ 'filename.txt', ... 'filename', ... '/path/to/filename.txt', ... '/', ... '.', ... '']: ... print ('"%s" : "%s"' % (path, os.path.splitext(path))) ... "filename.txt" : "('filename', '.txt')" "filename" : "('filename', '')" "/path/to/filename.txt" : "('/path/to/filename', '.txt')" "/" : "('/', '')" "." : "('.', '')" "" : "('', '')" >>>
(os.path.join(*paths
: اجزای یک مسیر را به یکدیگر متصل میکند [اسناد پایتون]:# GNU/Linux import os >>> os.path.join('one', 'two', 'three') 'one/two/three' >>> os.path.join(os.sep, 'one', 'two', 'three') '/one/two/three'
# Windows import os >>> os.path.join('one', 'two', 'three') 'one\\two\\three' >>> os.path.join(os.sep, 'one', 'two', 'three') '\\one\\two\\three'
همچنین برای ایجاد چندین مسیر به صورت همزمان، میتوان اجزای هر مسیر را به صورت یک توپِل (یا لیست) درون یک لیست قرار داد و سپس با استفاده از حلقه
for
، اجزای هر مسیر را جداگانه به تابعjoin
ارسال نمود. البته باید توجه داشت که میبایست پارامتر مشخص شده در تعریف تابعjoin
با یک ستاره مشخص شده باشد؛ در این حالت اجزای درون یک توپِل (یا لیست) به صورت پارامترهای جدا تابع در نظر گرفته میشوند، چیزی مانند نمونه کد بالا - در درس تابع دوباره به این شیوه ارسال پارامتر اشاره خواهد شد - به نمونه کد پایین توجه نمایید:>>> import os >>> for parts in [ ('one', 'two', 'three'), ... ('/', 'one', 'two', 'three'), ... ('/one', 'two', '/three', 'four'), ... ]: ... print (parts, ':', os.path.join(*parts)) ... ('one', 'two', 'three') : one/two/three ('/', 'one', 'two', 'three') : /one/two/three ('/one', 'two', '/three', 'four') : '/three/four' >>>
توجه
هر مسیر میبایست دقیقا شامل یک کاراکتر جدا کننده دایرکتوری (
os.sep
) باشد در غیر این صورت اجزا فقط از آخرین نمونه به بعد در نظر گرفته میشوند. این اتفاق در توپِل سوم از نمونه کد بالا رخ داده است:('one', 'two', '/three', 'four/')
(os.path.expanduser(path
: این تابع تنها یک پارامتر با ترکیبuser~
میپذیرد و کاراکتر~
را به مسیر دایرکتوری کاربر user در سیستم عامل تبدیل میکند [اسناد پایتون]:# GNU/Linux >>> os.path.expanduser('~saeid') '/home/saeid'
# Windows >>> os.path.expanduser('~saeid') 'C:\\Documents and Settings\\saeid'
# GNU/Linux >>> for user in [ '', 'saeid', 'www-data', 'postgres' ]: ... lookup = '~' + user ... print (lookup, ':', os.path.expanduser(lookup)) ... ~ : /home/saeid ~saeid : /home/saeid ~www-data : /var/www ~postgres : /var/lib/postgresql >>>
(os.path.expandvars(path
: این تابع مقدار متغیرهای محیطی موجود در پارامتر دریافتی را جایگزین کرده و حاصل را برمیگرداند. نام متغیرها میبایست با الگویname$
داخل پارامتر ذکر گردند. [اسناد پایتون]:>>> import os >>> os.environ['MYVAR'] = 'VALUE' >>> os.path.expandvars('/path/to/$MYVAR') '/path/to/VALUE'
(os.path.normpath(path
: مسیر را نرمالسازی میکند. در این راه تمام مسیرهایی که به یکی از اشکالA//B
A/B/
A/./B
A/foo/../B
هستند، به صورتA/B
ارزیابی میشوند. همچنین در سیستم عامل ویندوز کاراکتر جداکننده دایرکتوری گنولینوکس (/
) را به\
تبدیل میکند [اسناد پایتون]:>>> for path in [ 'one//two//three', ... 'one/./two/./three', ... 'one/../one/two/three', ... ]: ... print (path, ':', os.path.normpath(path)) ... one//two//three : one/two/three one/./two/./three : one/two/three one/../one/two/three : one/two/three >>>
# Windows >>> for path in [ 'one/two/three', ... ... 'one\\two\\three', ... 'one\\.\\two\\.\\three', ... 'one\\..\\one\\two\\three', ... ]: ... print (path, ':', os.path.normpath(path)) ... one/two/three : one\two\three one\two\three : one\two\three one\.\two\.\three : one\two\three one\..\one\two\three : one\two\three
(os.path.abspath(path
: مسیر نسبی را نرمالسازی کرده و به مسیر مطلق (Absolute - مسیری از ابتدا یا همان روت سیستم فایل - در گنولینوکس: مسیری که با/
شروع شده باشد - در ویندوز: مسیری که با نام یک درایو شروع شده باشد) تبدیل میکند. حاصل این تابع برابر با حاصل متد پایین میباشد. [اسناد پایتون]:(os.path.normpath(os.path.join(os.getcwd(), path)
>>> import os >>> os.getcwd() '/mnt/Data/WorkSpace/PythonPersianTutorial' >>> for path in [ '.', ... '..', ... './one/two/three', ... '../one/two/three']: ... print ('"%s" : "%s"' % (path, os.path.abspath(path))) ... "." : "/mnt/Data/WorkSpace/PythonPersianTutorial" ".." : "/mnt/Data/WorkSpace" "./one/two/three" : "/mnt/Data/WorkSpace/PythonPersianTutorial/one/two/three" "../one/two/three" : "/mnt/Data/WorkSpace/one/two/three" >>>
# Windows >>> import os >>> os.getcwd() 'C:\\Python34' >>> for path in [ '.', ... '..', ... './one/two/three', ... '../one/two/three']: ... print ('"%s" : "%s"' % (path, os.path.abspath(path))) ... "." : "C:\Python34" ".." : "C:\" "./one/two/three" : "C:\Python34\one\two\three" "../one/two/three" : "C:\one\two\three" >>>
گاهی لازم است که یک مسیر بررسی شود که آیا مربوط به یک فایل است یا دایرکتوری یا لینک نمادین (Symbolic link)، مسیر مطلق (Absolute) است یا خیر، اصلا وجود دارد یا خیر و ... برای این منظور میتوان از توابع پایین استفاده کرد:
isabs(path)
: چنانچه مسیر مطلق باشدTrue
برمیگرداند [اسناد پایتون]isfile(path)
: چنانچه مسیر مربوط به یک فایل که موجود نیز هست باشدTrue
برمیگرداند. این تابع لینکهای به فایل را نیز دنبال میکند، پس این تابع میتواند همراه با تابعislink
برای یک مسیر مشخص مقدارTrue
را برگرداند. [اسناد پایتون]isdir(path)
: چنانچه مسیر مربوط به یک دایرکتوری که موجود نیز هست باشدTrue
برمیگرداند. این تابع لینکهای به دایرکتوری را نیز دنبال میکند، پس این تابع میتواند همراه با تابعislink
برای یک مسیر مشخص مقدارTrue
را برگرداند. [اسناد پایتون]islink(path)
: چنانچه مسیر مربوط به یک لینک نمادین باشدTrue
برمیگرداند. [اسناد پایتون]exists(path)
: چنانچه مسیر دریافتی صرف نظر از اینکه مربوط به یک فایل است یا دایرکتوری، موجود باشدTrue
برمیگرداند. [اسناد پایتون]lexists(path)
:چنانچه مسیر لینک نمادین دریافتی موجود باشدTrue
برمی گرداند. این تابع لینک را دنبال نمیکند و بررسی نمیکند که لینک سالم هست یا خیر. [اسناد پایتون]1# Python 3.x 2# File Name: file_script.py 3 4import os 5 6for path in [ __file__, os.path.dirname(__file__), '/', '/var/www/html/wordpress']: 7 print ('Path :', path) 8 print ('Absolute :', os.path.isabs(path)) 9 print ('Is File? :', os.path.isfile(path)) 10 print ('Is Directory? :', os.path.isdir(path)) 11 print ('Is Link? :', os.path.islink(path)) 12 print ('Is Mount point? :', os.path.ismount(path)) 13 print ('Exists? :', os.path.exists(path)) 14 print ('Link Exists? :', os.path.lexists(path)) 15 print ()
Path : /home/saeid/Desktop/file_script.py Absolute : True Is File? : True Is Directory? : False Is Link? : False Is Mount point? : False Exists? : True Link Exists? : True Path : /home/saeid/Desktop Absolute : True Is File? : False Is Directory? : True Is Link? : False Is Mount point? : False Exists? : True Link Exists? : True Path : / Absolute : True Is File? : False Is Directory? : True Is Link? : False Is Mount point? : True Exists? : True Link Exists? : True Path : /var/www/html/wordpress Absolute : True Is File? : False Is Directory? : True Is Link? : True Is Mount point? : False Exists? : True Link Exists? : True
متغیر
__file__
در هر اسکریپتی به نام کامل آن اسکریپت اشاره دارد.مسیر چهارم در نمونه کد بالا در واقع مسیر لینکی است به یک دایرکتوری دیگر.
😊 امیدوارم مفید بوده باشه