کتابخانه OS در پایتون چیست؟ – معرفی و آموزش نحوه استفاده


اگر در پایتون برای تعامل با سیستم عامل، مشکل دارید، باید از کتابخانه OS کمک بگیرید. کتابخانه OS در پایتون، توابعی را برای تعامل با سیستم عامل فراهم کرده و در برطرف کردن این چالش به صورت بسیار سادهای موثر عمل میکند. کتابخانه OS در مجموعه ماژولهای کاربردی استاندارد پایتون قرار دارد. این ماژول روشهای قابل حملی را برای کار با ابزار وابسته به سیستم عامل فراهم میکند. ماژولهای OS و OS.Path شامل توابعی زیادی هستند که برای تعامل با فایل سیستم ساخته شدهاند. در این مطلب از مجله فرادرس انواع کاربردهای کتابخانه OS را بررسی کردهایم. برای هر کدام مثالی همراه با کدنویسی در زبان پایتون آماده کردهایم. در نهایت چند مورد از توابع پر کاربرد این کتابخانه را بررسی کردیم تا آشنایی اولیه و خوبی درباره کار با ماژول OS در پایتون بدست بیاورید.
کتابخانه OS در پایتون چیست؟
کتابخانه OS در پایتون، ماژولی درونی است. این کتابخانه، بسته به کارکرد مورد نیازمان روشهایی را برای استفاده از امکانات سیستم عامل فراهم میکند. کتابخانه OS به برنامههای پایتون کمک میکند که با روشهای مختلفی با سیستم عامل ارتباط برقرار کنند. این روشها شامل تکنیکهایی برای نوشتن و خواندن داده از فایل سیستم، شروع و توقف اجرای فرایندهای سیستمی و غیرسیستمی و غیره میشوند.
در کد پایین مثال مختصری از یکی از کاربردهای ساده این کتابخانه را نمایش دادهایم.
1import os
2print(os.name)
3
4# Output:
5# 'posix'
در این مثال ساده، ماژول os را فراخوانی و به کمک آن نام سیستم عامل را در خروجی چاپ کردیم. خروجی «posix» نشان میدهد سیستم عاملی که پشت صحنه کار میکند از نوع سیستمهای یونیکسی مانند لینوکس یا MacOS است. تا اینجای مطلب کتابخانه OS در پایتون را فقط به صورت بسیار ساده و کلی معرفی کردیم. در ادامه به ارائه جزییات بیشتری از این کتابخانه و کاربردهای پیشرفته ماژول osپرداختهایم.
شروع کار با کتابخانه OS در پایتون
کتابخانه OS در پایتون، کتابخانهای درونی است. به این معنا که برای استفاده از این کتابخانه نیازی به نصب هیچ پکیج یا ماژول اضافی بر روی پایتون ندارید.
این کتابخانه را به سادگی با استفاده از عبارت import میتوان به محیط کدنویسی پایتون یا اسکریپت پایتونی وارد کرد. در کد ساده زیر فرایند اجرای این عملیات را پیادهسازی کردهایم.
1import os
به محض این که کتابخانه OS را import کردیم، میتوان از توابع این کتابخانه استفاده کرد. این کار را با مثال سادهای شروع میکنیم. به عنوان مثال، برای شروع میتوانیم با استفاده از کتابخانه OS لیستی از فایلها و پوشههای درون مسیر مشخص شده را بهدست بیاوریم. به کدی که در ادامه برای نمایش این عملیات پیادهسازی شده توجه کنید.
1import os
2
3# Get the list of all files and directories in the root directory
4path = "/"
5dir_list = os.listdir(path)
6
7print("Files and directories in '", path, "' :")
8print(dir_list)
در کد بالا تابع os.listdir() لیستی را برمیگرداند. این لیست شامل نامهای تمام محتویات درون مسیر تعیین شده است. اگر برای این تابع مسیری مشخص نشده باشد. نام تمام محتویات پوشه فعلی که پایتون از آن اجرا میشود را برمیگرداند.
اگر در کد بالا برای دیدن نتیجه مسیر مورد نظر خودتان را به متغیر path اختصاص دهید، خروجی کد چیزی شبیه به اطلاعات نمایش داده شده پایین خواهد شد.
1Files and directories in ' / ' :
2['home', 'usr', 'var', 'lib', 'etc', 'bin', 'sbin', 'boot', 'tmp', 'srv', 'root', 'opt', 'mnt', 'media', 'proc', 'sys', 'dev', '.dockerenv']
کتابخانه OS در پایتون، تعداد زیادی از توابع دیگری را فراهم میکند که به کمک آنها میتوان با سیستم عامل تعامل داشت. برای مثال، میتوانیم از تابع os.getcwd() برای بدست آوردن آدرس محل کار فعلی پایتون یا CWD استفاده کرد. در ادامه مطلب درباره CWD توضیح بیشتری ارائه کردهایم. از تابع os.listdir() برای فهرست کردن تمام فایلها و پوشههای درون دایرکتوری فعلی استفاده میشود. همچنین میتوانیم از تابع os.mkdir() برای ایجاد پوشهای جدید در هر محل مورد نظر، استفاده کنیم.

در کد پایین از هر کدام از توابع نامبرده شده بالا با یک خط کد، مثالی پیادهسازی کردهایم.
1import os
2
3# Get the current working directory
4print(os.getcwd())
5
6# List all files and directories in the current directory
7print(os.listdir())
8
9# Create a new directory
10os.mkdir('test_directory')
11
12# Verify if the new directory has been created
13print('test_directory' in os.listdir())
14
15# Output:
16# /home/user
17# ['file1', 'file2', 'dir1']
18# True
در بلاک کد بالا، اول از همه آدرس محل CWD را در کنسول خروجی چاپ کردیم. سپس همه فایلها و پوشههای درون CWD را نمایش دادیم. بعد از آن پوشه جدیدی به نام test_directory را در محل CWD ایجاد کردیم. در نهایت هم با بررسی وجود داشتن test_directory در فهرست فایلها و پوشههای CWD فرایند ساخت پوشه جدید را بررسی کردیم.
کتابخانه OS ابزار قدرتمندی است که به برنامهنویسان در انجام بسیاری از کارهای مربوط به سیستم عامل به صورت خودکار و اسکریپتی کمک میکند. همه این کارها در شرایط عادی –بدون استفاده از کتابخانه OS- نیاز به مداخله دستی دارند. البته باید توجه شود که در استفاده از این ابزار نیاز به دقت و احتیاط داریم. برای مثال، توابعی مانند os.remove() و os.rmdir() میتوانند فایلها و پوشهها را حذف کنند. برای همین همیشه قبل از اجرای برنامه باید کدمان را دوبار بررسی کنیم تا از حذف شدن تصادفی فایلهای مهم جلوگیری کنیم.
چگونه مهارت برنامه نویسی خود را در پایتون افزایش دهیم؟
کتابخانه os در پایتون یکی از کتابخانههای تخصصی این زبان برنامهنویسی است. در صورت داشتن توانایی کار با این کتابخانه باید از خودتان راضی باشید. زیرا که در مسیر یادگیری پایتون پیشرفت خوبی داشتهاید. اما این رضایت نباید مانع از ادامه مسیر شود. یادگیری زبانهای برنامهنویسی به مرور افزایش مهارت هم جذابتر میشود و هم کاربردیتر. برای ادامه مسیر روشهای مختلفی وجود دارند که میتوانیم با توجه به شرایط خود، هر کدام را انتخاب کنیم. اما بهترین راه، استفاده از فیلمهای آموزشی است.

سایت فرادرس فیلمهای بسیار خوبی با کیفیت عالی در روش آموزش و متناسب با همه سطوح دانش را برای دانشجویان فراهم کرده است. این فیلمهای آموزشی با دقت و حساسیت بالایی در انتخاب استاد و روش تدریس و حتی کیفیت مطالب مورد تدریس تولید شدهاند. در صورتی که علاقهمند به افزایش مهارت خود در زبان برنامهنویسی پایتون هستید، فیلمهای آموزشی زیر میتوانند گزینه خوبی برای شروع باشند.
- فیلم آموزش برنامه نویسی تابعی در پایتون فرادرس
- فیلم آموزش برنامه نویسی شی گرا در پایتون فرادرس
- فیلم آموزش برنامه نویسی ترفندهای پیشرفته پایتون در فرادرس
- فیلم آموزش تجزیه و تحلیل و آماده سازی داده ها با پایتون در فرادرس
تکنیک های پیشرفته کتابخانه OS در پایتون
با عمیقتر شدن بیشتر در کتابخانه OS، متوجه میشویم که این کتابخانه چیزهایی بیش از عملیات پایه و سادهای بر روی فایلها و پوشهها ارائه میدهد. کتابخانه OS ابزاری را هم برای کار با پارامترهای پردازشی و تعامل با متغیرهای محیطی و سایر موارد فراهم کرده است.
کار با پارامترهای پردازشی
کتابخانه OS در پایتون چندین تابع مختلف را برای تعامل با پارامترهای پردازشی فراهم میکند. برای مثال، تابع os.getpid() شماره شناسایی فرایند درحال پردازش را برمیگرداند در حالی که تابع os.getppid() شماره شناسایی پردازش والد فرایند در حال اجرا را برمیگرداند.
در مثال پایین از هر دو تابع گفته شده در بالا استفاده کردهایم. به کد زیر توجه کنید.
1import os
2
3# Get the current process ID
4print(os.getpid())
5
6# Get the parent process ID
7print(os.getppid())
8
9# Output:
10# 12345
11# 12344
در این نمونه، عدد 12345 شماره شناسایی پردازش درحال اجرا و عدد 12344 شماره شناسایی پردازش والد پردازش در حال اجرا است.
تعامل با متغیرهای محیطی
«متغیرهای محیطی» (Environment Variables)، متغیرهایی هستند که در سراسر سیستم در دسترساند و هر فرایند پردازشی میتواند به این متغیرها دسترسی داشته باشد. کتابخانه OS در پایتون توابع مختلفی را برای تعامل با متغیرهای محیطی فراهم کرده است. برای مثال، شی os.environ شیی شبیه به دیکشنری است که برای دسترسی و کار و تغییردادن متغیرهای محیطی استفاده میشود.

در کد پایین نمونهای از استفاده این شیء را پیادهسازی کردهایم.
1import os
2
3# Get the value of the 'HOME' environment variable
4print(os.environ['HOME'])
5
6# Set a new environment variable
7os.environ['TEST'] = 'Hello, World!'
8
9# Verify that the new environment variable has been set
10print(os.environ['TEST'])
11
12# Output:
13# /home/user
14# Hello, World!
در مثال بالا، در ابتدا مقدار متغیر محیطی HOME را به دست میآوریم. این متغیر محیطی معمولا شامل مسیر پوشه اصلی کاربر فعلی است. سپس متغیر محیطی جدید را با نام TEST مقداردهی میکنیم و بررسی میکنیم که آیا این متغیر جدید به صورت صحیح تنظیم شده است یا نه.
اینها فقط چند مثال ساده از کاربردهای پیشرفتهای هستند که توسط کتابخانه OS در پایتون ارائه میشوند. با کمی خلاقیت میتوان از این ابزارها برای خودکار کردن و اسکریپتی کردن وظایف پیچیده نیز بهره برد. این کار باعث میشود که برنامههای پایتونی قدرتمندتر و انعطافپذیرتر شوند.
بررسی گزینه های جایگزین کتابخانه OS در پایتون
با اینکه ماژول os در پایتون ابزاری قدرتمند برای تعامل با سیستم عامل است اما تنها ابزار در دسترس برنامهنویسان پایتونی نیست. گزینههای دیگری مانند کتابخانههای sys و subprocess نیز وجود دارند که روشهایی را برای تعامل با سیستم عامل ارائه میدهند. در این بخش به بررسی این دو کتابخانه در دسترس، پرداختهایم.
کتابخانه Sys
کتابخانه Sys دسترسی به بعضی متغیرهای خاص را فراهم میکند. این نوع از متغیرها برای استفاده یا کار توسط مفسر پایتون و عملیاتی که به صورت فعالی با مفسر در تعامل هستند بکار میروند.
در کد پایین مثال سادهای در بکارگیری از کتابخانه Sys را برای چاپ نسخه پایتون مورد استفاده پیادهسازی کردهایم.
1import sys
2
3# Print Python version
4print(sys.version)
5
6# Output:
7# 3.9.1 (default, Dec 11 2020, 06:28:49)
8# [GCC 10.2.0]
در مثال بالا، کتابخانه sys را در محیط کدنویسی پایتونی خود وارد کرده و نسخه پایتون مورد استفاده را در خروجی چاپ کردهایم. خروجی این برنامه شماره نسخه پایتون را همراه با اطلاعات اضافی درباره ساخت این نسخه نمایش میدهد.
کتابخانه Subprocess
کتابخانه Subprocess به برنامهنویسان کمک میکند که پردازشهای جدیدی را خلق کنند و به پایپهای ورودی، خروجی یا خطای آنها متصل شوند. در نتیجه برنامهها میتوانند کدهای برگشتی این پردازشها را دریافت کنند. این کتابخانه ابزار قدرتمندی برای اجزای فرمانهای شل از طریق اسکریپتهای پایتونی فراهم کرده است.
در کد پایین مثالی درباره استفاده از کتابخانه subprocess برای فهرست کردن فایلهای درون پوشه فعلی را پیادهسازی کردهایم.
1import subprocess
2
3# Run a shell command and get its output
4output = subprocess.check_output('ls', universal_newlines=True)
5
6# Print the output
7print(output)
8
9# Output:
10# file1
11# file2
12# dir1
در این مثال، از تابع subprocess.check_output() برای اجرای فرمان ls کمک گرفتهایم. این فرمان فایلهای درون پوشه فعلی را فهرست میکند. آرگومان universal_newlines=True باعث میشود که دادههای خروجی بهجای شکل بایتی به شکل رشته برگشت داده شوند.
با اینکه کتابخانههای sys و subprocess جایگزینهای قدرتمندی را بهجای کتابخانه OS ارائه میدهند، اما پیچیدگیهای منحصر به خود و خطرات بالقوهای را نیز دارند. برای مثال، کتابخانه Subprocess برای دوری کردن از آسیبپذیریهای امنیتی، نیازمند مدیریت بسیار دقیقی در ارتباط با فرامین شل است. مانند همیشه ضروری است که ابزاری مورد استفاده خود و مفاهیم کدهای نوشته شدهمان را به خوبی درک کنیم و قبل از استفاده با نکتههای هر کدام از این کتابخانهها و توابعشان بهخوبی آشنا شویم.
عیب یابی مشکلات رایج کتابخانه OS در پایتون
در حین کار با ماژول os در پایتون ممکن است که به مشکلات مشخصی بر بخوریم. هدف از این بخش بحث درباره ۲ نوع از رایجترین مشکلات ممکن و ارائه راه حلهای متناسب با این مشکلات است.

مشکلات مربوط به سازگاری در ماژول os
کتابخانه OS در پایتون برای کار با انواع گستردهای از سیستمهای عامل طراحی شده است. اما بر روی همه سکوهای مختلف، همه توابع در دسترس نیستند. برای نمونه، توابع مشخصی فقط در سیستم عاملهای یونیکسی در دسترساند و در ویندوز قابل استفاده نیستند.
برای اینکه از مشکلات مربوط به سازگاری دور بمانیم باید قبل از استفاده این توابع، مستندات مربوطه را با دقت مطالعه کنیم. باید در نهایت مطمئن شویم که توابع مورد استفاده در کدها توسط سیستم عامل میزبان برنامه پشتیبانی میشوند.
خطاهای مربوط به مجوز
ممکن است در هنگام کار با فایلها و پوشهها با «خطاهای مربوط به مجوز» (Permission Errors) روبهرو شویم. اغلب اوقات این خطاها وقتی رخ میدهند که در کدهایمان درخواست دسترسی به پوشه یا فایلی را داریم که اکانت کاربری مورد استفاده در آن لحظه، مجوز لازم برای دسترسی به این فایل یا پوشه را در اختیار ندارد.
برای نمونه، تلاش برای حذف فایلی که مجوز حذف آن را نداریم باعث برخواستن خطای مجوز میشود. به کدی که در ادامه آمده توجه کنید. در این کد مثال زده شده را پیادهسازی کردهایم.
1import os
2
3try:
4 os.remove('/path/to/file')
5except PermissionError:
6 print('Permission error: Unable to delete file')
7
8# Output:
9# Permission error: Unable to delete file
در مثال بالا، سعی میکنیم فایلی را حذف کنیم. اگر مجوز لازم را برای حذف این فایل نداشتیم خطایی با برچسب PermissionError بر خواهد خواست. در نتیجه برای مدیریت این خطا در بلاک try/except پیغامی را مشخص کردهایم. پیغام مشخص شده، در صورت بروز این خطا بر روی خروجی چاپ میشود.
برای اجتناب از روبهرو شدن با خطاهای مربوط به مجوز، باید مطمئن شد که اکانت کاربری مورد استفاده در ارتباط با فایلها و پوشههای طرف کار برنامه، دارای مجوزهای مربوطه است. اما اگر در حال نوشتن اسکریپتی برای استفاده دیگران هستیم، بهتر است که سیستم مدیریت خطایی در نظر بگیریم که خطاهای مربوط به مجوز را به بهترین حالت ممکن مدیریت کند. همچنین این سیستم باید بتواند برای کاربران برنامه، اطلاعات و بازخورد مفیدی را برگرداند.
به یاد داشته باشیم که کتابخانه OS در پایتون ابزار قدرتمندی است اما با این قدرت، مسئولیت نیز به وجود میآید. همیشه باید کد خود را دوبار چک کنیم تا از ایجاد تغییرات ناخواسته و حذف فایلهای مهم جلوگیری کنیم.
فرایند اجرایی پس زمینه کتابخانه OS در پایتون
قبل از اینکه به بحث درباره کاربردهای پیشرفتهتر کتابخانه OS در پایتون بپردازیم، ضروری است که با اصول زیر بنایی این کتابخانه آشنا شویم.
کتابخانه OS در پایتون
کتابخانه OS در پایتون، کتابخانهای درونی است. به این معنا که این کتابخانه با نسخه استاندارد پایتون همراه است و برای استفاده نیازی به نصب هیچ پکیجی به صورت جداگانه نیست. این کتابخانه روشهای را بر اساس کارآمدی برای کار با سیستم عامل فراهم کرده است. عملیاتی مانند خواندن یا نوشتن اطلاعات بر روی فایل سیستم، صدور فرمان شروع یا توقف پردازشها و سایر عملیاتی از این قبیل از تواناییهای کتابخانه OS است.
اما در پشت پرده، ماژول os روش قابل حملی از کار با ویژگیهای خاص سیستم عامل را فراهم کرده است. کتابخانه OS این عملیات را با در دسترس قرار دادن توابع خاصی انجام میدهد. این توابع خاص از طریق سیستم عامل مرجع برای فراخوانی رفتارهای سیستمی فراهم شدهاند. سیستم عامل مرجع، سیستم عاملی است که سایر سیستمهای عامل از روی آن ساخته و پرداخته شدهاند. دلیل اصلی اینکه بعضی از توابع کتابخانه OS بر روی همه سیستمهای عامل در دسترس نیستند، همین مسئله است.
پایتون و سیستم عامل
وقتی که برنامه پایتونی را اجرا میکنیم، این مسئله فقط مربوط به تعامل با کدهای نوشته شده نمیشود. این مطلب در ارتباط با تعامل با سیستم عامل نیز هست. سیستم عامل نرمافزاری است که منابع نرمافزاری و سختافزارهای کامپیوتر را مدیریت میکند. سیستم عامل خدماتی مانند مدیریت فایلها، زمانبندی پردازشها و مدیریت حافظه را ارائه میدهد.

مانند دیگر زبانهای برنامهنویسی سطح بالا، پایتون نیز لایه انتزاعی را بین کدهای نوشته شده و سیستم عامل ایجاد میکند. وجود این لایه انتزاعی، نوشتن کدهایی که بتوانند بر روی سیستم عاملهای مختلف کار کنند را آسان میکند. کتابخانه OS در پایتون قسمتی از این لایه انتزاعی است.
در ادامه به مثال سادهای از نحوه تعامل پایتون با سیستم عامل با کمک کتابخانه OS پرداختهایم. کد زیر پیادهسازی ساده و شفافی از این عملیات کوچک را نمایش میدهد.
1import os
2
3# Get the current working directory
4current_directory = os.getcwd()
5
6print(current_directory)
7
8# Output:
9# '/home/user'
در مثال بالا، از تابع os.getcwd() برای بدست آوردن آدرس CWD پایتون استفاده کردهایم. این تابع برای بدست آوردن این اطلاعات با سیستم عامل تعامل میکند. در نهایت هم این اطلاعات را به برنامه پایتون برمیگرداند. پیدا کردن درک درستی از این اصول پایه برای درک بهتر باقی مثالها و تکنیکهای مورد بحث در ادامه این مطلب کمک میکند.
کتابخانه OS در پایتون در پروژه های بزرگتر
کتابخانه OS فقط برای استفاده در اسکریپتهای کوچک یا وظایف یکبار اجرا شونده نیست. این کتابخانه میتواند نقش مهمی نیز در برنامههای بزرگتر مانند برنامههای کاربردی اینترنتی یا برنامههای مربوط به «تجزیه و تحلیل داده» (Data Analysis) ایفا کند.
کتابخانه OS در پایتون در اپلیکیشن های اینترنتی
در اپلیکیشنهای اینترنتی، میتوان از کتابخانه OS در پایتون برای انجام طیف گستردهای از وظایف بهره گرفت. برای نمونه، با کمک ابزارهای این کتابخانه میتوان اطلاعات را به روی فایلها نوشت یا از روی آنها خواند. این عملیات برای کارهایی مانند ورود به برنامهها و سایتها یا مدیریت حافظه کاربرد دارد. همچنین این کتابخانه برای تعامل با سیستم عامل مرجع و زیربنایی از طریق روشهای تعیین شده برای برطرف کردن نیازهای برنامه بکار برده میشود.
کتابخانه OS در پایتون در Data Analysis
بهطور ویژه میتوان از کتابخانه OS برای مدیریت فایلهای داده در Data Analysis استفاده کرد. به عنوان نمونه، میتوانیم با استفاده از این کتابخانه همه فایلهای درون پوشهای را فهرست کنیم، دادهها را از روی فایلها بخوانیم و بر روی فایلها بنویسیم. این تواناییها بهطور ویژه وقتی مفید واقع میشوند که با مجموعه دادههای بزرگی کار کنیم که بر روی چندین فایل مختلف ذخیره شدهاند.
کاربردهای کتابخانه OS در پایتون چه هستند؟
در ادامه مطلب، برای تکمیل کردن مطالب گفته شده چند مورد از کاربردهای مهم ماژول os را نام بردهایم.
- مدیریت CWD | Current Working Directory
- ایجاد دایرکتوری سفارشی
- فهرست کردن فایلها و دایرکتوریها با پایتون
- حذف دایرکتوری یا فایلها با استفاده از پایتون
مدیریت CWD
دایرکتوری محل کار پایتون (Current Working Directory | CWD) را به عنوان پوشهای در نظر بگیرید که محل کار فعلی پایتون در آن پوشه است. هر وقت که فایلها فقط به وسیله نامشان فراخوانی شوند، پایتون چنین در نظر میگیرد که این فایلها در CWD قرار دارند. در واقع مفسر پایتون، آدرس فایلهای را که فقط با نام فراخوانی میشوند بهطور خودکار با آدرس CWD شروع میکند. این روش ارجاع دادن فایل فقط در صورتی بهطور صحیح کار خواهد کرد که فایل مورد نظر دقیقا در محل CWD پایتون قرار داشته باشد.
توجه کنید که پوشهای که اسکریپت پایتون در آن اجرا میشود به عنوان دایرکتوری فعلی شناخته میشود و فرقی ندارد که کجا باشد. این پوشه شاید حتی مسیری نباشد که اسکریپت پایتون در آن قرار دارد.

بدست آوردن آدرس CWD در پایتون
برای بدست آوردن آدرس محل کار فعلی در پایتون از تابع os.getcwd() استفاده میشود.
به عنوان مثال، در این کد از ماژول os برای بدست آوردن و چاپ محل کار فعلی اسکریپت پایتون CWD –همان جایی که پایتون اجرا شده- استفاده کردهایم. در کد زیر با استفاده از تابع os.getcwd() محل CWD را بازیابی کرده و سپس این آدرس را در کنسول برای کاربر چاپ میکنیم.
به کد زیر توجه کنید. در این کد، روش استفاده از تابع os.getcwd() را پیادهسازی کردهایم.
1import os
2cwd = os.getcwd()
3print("Current working directory:", cwd)
خروجی کد بالا به شکل زیر است. توجه کنید که این آدرس مربوط به کامپیوتر محل اجرای برنامه است و حتما در کامپیوتر شما فرق خواهد کرد.
Current working directory: /home/Mostafa Rashidi/Desktop/Blog
تغییر دادن محل CWD در پایتون
برای تغییر دادن محل کار پایتون یا همان آدرس CWD از تابع os.chdir() استفاده میکنیم. این تابع CWD را به مسیر مشخص شده تغییر میدهد. این متد فقط یک آرگومان میپذیرد که همان مسیر جدید دایرکتوری است. به این نکته توجه کنید که محل کار فعلی همان پوشهای است که در آن اسکریپت پایتون در حال پردازش شدن است.

به عنوان مثال، کدی پیادهسازی کردهایم که محل CWD را بررسی میکند. سپس اطلاعات استخراج شده را در خروجی نمایش میدهد. کد پیادهسازی شده این فعالیت را دوبار انجام میدهد. یکبار قبل از جابهجا شدن و دفعه دوم بعد از تغییر CWD این اطلاعات را به خروجی ارسال میکند. برای تغییر CWD در این کد محل کار را به اندازه یک پوشه با استفاده از تکه کد os.chdir('../') به بالا بردهایم.
کد پایین، مثال سادهای از روش کار با اطلاعات محل کار پایتون یا CWD را نمایش میدهد. به کد زیر توجه کنید.
1import os
2def current_path():
3 print("Current working directory before")
4 print(os.getcwd())
5 print()
6current_path()
7os.chdir('../')
8current_path()
خروجی کد بالا به صورت زیر در کنسول برنامه چاپ میشود. آدرسهای نمایش داده شده مربوط به کامپیوتر محل پیادهسازی و اجرای کد میباشد.
Current working directory before C:\Users\Mostafa Rashidi Aggarwal\Desktop\Blog Current working directory after C:\Users\Mostafa Rashidi Aggarwal\Desktop
ایجاد یک دایرکتوری جدید
در این بخش درباره انواع روشها برای ساخت دایرکتوری جدید بحث کردهایم که شامل دو متد اشاره شده در پایین میشود.
- متد os.mkdir()
- متد os.makedirs()
در ادامه تلاش کردیم برای درک بیشتر این متدها هر کدام را با مثال همراه با کد توضیح دهیم.
استفاده از متد os.mkdir برای ساخت دایرکتوری
از متد os.mkdir() در پایتون برای ایجاد دایرکتوری جدید با نام تعیین شده استفاده میشود. نام این دایرکتوری مسیری است که به عنوان پارامتر به متد ارسال میکنیم. این متد پارامتر دلخواه دیگری نیز به نام «حالت» (Mode) دریافت میکند. برای این پارامتر فقط مقادیر عددی قابل ارسال هستند. پارامتر Mode مجوزهایی را تعیین میکند که دایرکتوری باید بپذیرد. اگر دایرکتوری که قرار است ساخته شود از قبل وجود داشته باشد این متد خطای FileExistsError را بر میگرداند.
به عنوان مثال به کد زیر توجه کنید. فرایند پیادهسازی شده پایین در زیر این کد توضیح داده شده است.
1import os
2directory = "Faradars"
3parent_dir = "D:/Python projects/"
4path = os.path.join(parent_dir, directory)
5
6os.mkdir(path)
7print("Directory '% s' created" % directory)
8directory = "Faradars.Blog"
9parent_dir = "D:/Python projects"
10mode = 0o666
11path = os.path.join(parent_dir, directory)
12os.mkdir(path, mode)
13print("Directory '% s' created" % directory)
کد بالا دو پوشه ایجاد میکند. پوشه اول به نام Faradars که در مسیر D:/Pycharm projects/ قرار دارد و پوشه دوم به نام Faradars.Blog که این پوشه نیز در همان مسیر D:/Pycharm projects/قرار میگیرد. پوشه اول با استفاده از متد os.mkdir() ساخته میشود بدون اینکه مقداری را برای Mode تعیین کنیم. در نتیجه این پوشه با مجوزهای پیشفرض خود فعال میشود. دایرکتوری دوم هم با این روش ساخته شده اما این بار به تابع os.mkdir()پارامتر اختیاری modeرا با مقدار 0o666 ارسال کردیم. این Mode مشخص میکند که این دایرکتوری مجوز خواندن و نوشتن را دارد. در آخر هم این کد پیامهایی را در خروجی چاپ میکند. این پیامها نشان میدهد دایرکتوریهای جدید ساخته شدند.
خروجی کد بالا به صورت زیر در خروجی نمایش داده میشود.
Directory 'Faradars' created Directory 'Faradars.Blog' created
در صورتی که برای کار با فایلها یا پوشهها در پایتون نیاز به مطالعه مطلب خلاصهتری داشته باشید میتوانید از مطلب مدیریت فایل و پوشه در پایتون به زبان ساده در مجله فرادرس بهرهمند شوید. این مطلب به صورت خلاصه، بیشتر کارهایی که میتوان با فایلها و پوشهها در پایتون انجام داد را توضیح داده است.
استفاده از متد os.makedirs برای ساخت دایرکتوری
برای اینکه بتوانیم دایرکتوری را «به صورت بازگشتی» (Recursively) ایجاد کنیم، از متد os.makedirs() در پایتون استفاده میکنیم. ایجاد دایرکتوری به صورت بازگشتی به این معنا است که در زمان ساخت هر پوشه فقط کافی است مسیر مورد نظر را به این تابع ارسال کنیم. اگر در وسط مسیری که در نظر داریم یک یا چند دایرکتوری وجود نداشت، متد os.makedirs() خودش همه دایرکتوریهای لازم در طول مسیر را نیز ایجاد میکند.
به عنوان مثال به کد زیر توجه کنید. در این کد دو دایرکتوری به نامهای Mostafa Rashidi و c به صورت جدا از هم ساخته میشوند. این دایرکتوریها در دایرکتوریهای والد جداگانهای تشکیل شدهاند. در کد پایین از متد os.makedirs() استفاده کردهایم که از بابت وجود داشتن دایرکتوریهای والد مطمعن شویم. یعنی حتی اگر که دایرکتوریهای مسیری که مشخص کردیم وجود نداشتند این متد خود اقدام به ساخت همه دایرکتوریهای غایب میکند تا تمام مسیری که تعیین کردهایم ساخته شود. علاوه بر اینها این متد برای دایرکتوری c مجوز هم تعیین میکند. در نهایت هم برای نشان دادن خاتمه ساخت این دایرکتوریها برنامه پیادهسازی شده، پیغامی را در خروجی به کاربر نمایش میدهد.
1import os
2directory = "Mostafa Rashidi"
3parent_dir = "D:/Python projects/Faradars/Authors"
4path = os.path.join(parent_dir, directory)
5os.makedirs(path)
6print("Directory '% s' created" % directory)
7directory = "c"
8parent_dir = "D:/Python projects/Faradars/a/b"
9mode = 0o666
10path = os.path.join(parent_dir, directory)
11os.makedirs(path, mode)
12print("Directory '% s' created" % directory)
خروجی کد بالا به شکل زیر است.
Directory 'Mostafa Rashidi' created Directory 'c' created
فهرست کردن همه فایل ها و دایرکتوری ها با پایتون
در پایتون میتوانیم با استفاده از متد os.listdir() فهرستی از همه پوشهها و فایلهای درون دایرکتوری مورد نظر خود ایجاد کنیم. اگر در زمان کار با این متد هیچ دایرکتوری خاصی را به عنوان پارامتر به متد ارسال نکنیم، متد os.listdir() بهطور پیشفرض فهرستی از همه فایلها و پوشههای درون CWD را بر میگرداند.

برای مثال به کد زیر توجه کنید. این کد همه فایلها و پوشههای درون دایرکتوری Root “/” را فهرست میکند. در این کد از متد os.listdir() استفاده کردهایم که فهرستی از همه فایلها و دایرکتوریهای درون مسیر مشخص شده تهیه کند و در نهایت به برنامه دستور دادهایم که نتیجه نهایی را برای نمایش در خروجی چاپ کند.
1import os
2path = "/"
3dir_list = os.listdir(path)
4print("Files and directories in '", path, "' :")
5print(dir_list)
خروجی کد بالا به شکل زیر است.
Files and directories in ' / ' : ['sys', 'run', 'tmp', 'boot', 'mnt', 'dev', 'proc', 'var', 'bin', 'lib64', 'usr', 'lib', 'srv', 'home', 'etc', 'opt', 'sbin', 'media']
حذف پوشه یا فایل با استفاده از پایتون
ماژول os در پایتون دو روش مختلف را برای حذف فایلها و پوشهها توسعه داده است. این روشها را در ادامه فهرست کردهایم.
- استفاده از متد os.remove()
- استفاده از متد os.rmdir()
استفاده از متد os.remove
با استفاده از متد os.remove() در پایتون، میتوان فایلی را که آدرس مسیرش به عنوان پارامتر ارسال شده حذف کرد. این متد توانایی حذف کردن دایرکتوری را ندارد. اگر مسیری که به عنوان پارامتر به متد ارسال شده ختم به دایرکتوری شود، منجر به برگشت دادن خطای OSError خواهد شد.

کد پیادهسازی شده پایین فایلی را با نام file1.txt از مسیر مشخص شده در زیر حذف خواهد کرد.
D:/Python projects/Faradars/Authors/Mostafa Rashidi/
کد زیر برای حذف کردن فایل از تابع os.remove() استفاده کرده است.
1import os
2file = 'file1.txt'
3location = "D:/Python projects/Faradars/Authors/Mostafa Rashidi/"
4path = os.path.join(location, file)
5os.remove(path)
در اثر اجرای کد بالا فضای داخل دایرکتوری به شکل زیر در میآید.
استفاده از متد os.rmdir
کتابخانه OS در پایتون متد os.rmdir() را برای حذف پوشه خالی تعریف کرده است. اما اگر مسیر اشاره شده به پوشه خالی منتهی نشود، اجرای این کد خطای OSError را بر میگرداند.
به عنوان مثال فرض کنیم که دایرکتوریهای مورد نظر به شکل زیر هستند.

این کد تلاش میکند که دایرکتوری به نام Faradars.Blog را از مسیر “D:/Python projects/” حذف کند. در کد بالا برای حذف این دایرکتوری از تابع os.rmdir() استفاده شده است. بعد از اجرای کد اگر دایرکتوری که داده شده خالی باشد بهسادگی حذف میشود و اگر دایرکتوری شامل فایل یا حتی دایرکتوریهای دیگری باشد، برنامه در خروجی به کاربر خطا بر میگرداند.
به کد زیر توجه کنید تا روش پیادهسازی و استفاده از تابع os.rmdir() را ببینید.
1import os
2directory = "Faradars.Blog"
3parent = "D:/Python projects/"
4path = os.path.join(parent, directory)
5os.rmdir(path)
در اثر اجرای کد بالا فضای داخل دایرکتوری به شکل زیر در میآید.

برای آموزش بیشتر و عمیقتر این کتابخانه جامع و مفید میتوانید به فیلم آموزش ماژول سیستم عامل در پایتون فرادرس مراجعه کنید.
پرکاربردترین توابع کتابخانه OS در پایتون کدام هستند؟
با توجه به تجربه برنامهنویسان ارشد و اتفاقاتی که در پروژههای واقعی رخ میدهند، میتوان از توابع زیر به عنوان پرکاربردترین توابع کتابخانه OS نام برد.
- تابع os.name()
- تابع os.error()
- تابع os.popen()
- تابع os.close()
- تابع os.rename()
- تابع os.remove()
- تابع os.path.exists()
- تابع os.path.getsize()
برای اینکه بتوانید با موارد بیشتری از کاربردهای کتابخانه OS در پایتون و ماژولهایی شبیه آن آشنا شوید، پیشنهاد میکنیم که مطلب ۱۰ متد کار با فایل سیستم در پایتون از مجله فرادرس را نیز مطالعه کنید.
در ادامه هر کدام از توابع پرکاربرد نامبرده شده در این مطلب را به همراه مثالهای کدنویسی شده توضیح دادهایم. به ترتیب از تابع اول شروع میکنیم.
تابع os.name
تابع os.name() با توجه به سیستم عامل، نام ماژولی را که به محیط کد نویسی «وارد» (Import) شده برمیگرداند. در حال حاضر نامهای «pOSix» و «nt» و «OS2» و «ce» و «java» و «riscOS» ثبت شدهاند. به کد زیر توجه کنید.
1import os
2
3print(os.name)
خروجی کد بالا به صورت کلمه posix به کاربر نمایش داده میشود، اما این کد با توجه به مفسرهای گوناگون پایتون نسبت به سیستم عاملهای مختلف، شاید بعد از اجرای کد بر روی سیستم دیگری خروجی متفاوتی مانند nt را نمایش دهد.

تابع os.error
همه توابع داخل کتابخانه OS در پایتون در شرایطی که نام یا مسیر فایلها معتبر نباشند یا غیر قابل دسترسی باشد خطای OSError را بر میگردانند. حتی اگر آرگومانهای ارسال شده به این توابع از نوع معتبر باشند اما توسط سیستم عامل تایید نشوند باز هم خطای OSError در خروجی برنامه نمایش دادهخواهد شد. سپس اجرای برنامه متوقف میشود. کلمه «os.Error» نام مستعاری است که برای خطای استثنای توکار OSError استفاده میشود.
کد آمده در پایین محتوای فایل GFG.txt را میخواند. این کد از بلوک خطای try…except برای مدیریت خطاهای احتمالی استفاده میکند، به خصوص خطای IOError که در صورت وجود هر مشکلی در زمان خواند فایل رخ میدهد. در هر صورت، اگر خطایی رخ بدهد پیغامی مبنی بر وجود مشکل در خواندن فایل GFG.txt به شکل Problem reading: GFG.txt در کنسول اجرای برنامه چاپ میشود.
1import os
2try:
3 filename = 'GFG.txt'
4 f = open(filename, 'rU')
5 text = f.read()
6 f.close()
7
8except IOError:
9
10 print('Problem reading: ' + filename)
خروجی کد بالا به صورت زیر است.
Problem reading: GFG.txt
تابع os.popen
متد os.popen() میتواند دریچهای را به فایل یا از فایل متنی به بیرون باز کند. مقدار برگشتی از برنامه با توجه به اینکه mode بر روی r یا w تنظیم شده میتواند از فایل خوانده یا بر روی فایل نوشته شود. سینتکس پایه متد os.popen() به شکل زیر است.
os.popen(command[, mode[, bufsize]])
پارامترهای mode و bufsize جزو پارامترهای اجباری نیستند. این پارامترها اگر ارائه نشوند حالت modeبه صورت پیشفرض بر روی r تنظیم خواهد شد.
کد پایین فایلی به نام GFG.txt را در حالت فقط نوشتنی باز میکند. سپس کلمه Hello را در این فایل مینویسد. بعد از آن محتویات این فایل را میخواند و بر روی کنسول خارجی چاپ میکند. اغلب استفاده از تابع os.popen() توصیه نمیشود و در همچین مسئلههایی استفاده از عملیات استاندارد مخصوص فایل اولویت دارد.
به کد آمده در پایین توجه کنید.
1import os
2fd = "GFG.txt"
3
4file = open(fd, 'w')
5file.write("Hello")
6file.close()
7file = open(fd, 'r')
8text = file.read()
9print(text)
10
11file = os.popen(fd, 'w')
12file.write("Hello")
این کد در خروجی کلمه Hello را چاپ میکند.
به این نکته توجه کنید که خروجی تابع popen() به صورت مستقیم نمایش داده نمیشود اما این تابع میتواند تغییرات را بهشکل مستقیم درون فایل اعمال کند.
تابع os.close
اگر فایلی را در پایتون با استفاده از تابع open() باز کردید، فقط میتوانید این فایل را با استفاده از تابع close() ببندید. اما اگر فایل با استفاده از تابع os.popen() باز شده بود میتوانید با یکی از توابع close() یا os.close() این فایل را ببندید. اگر تلاش کنیم فایلی را که با تابع open() باز شده با استفاده از تابع os.close() ببندیم زبان برنامهنویسی پایتون خطای TypeError را در خروجی نمایش خواهد داد.
1import os
2
3fd = "GFG.txt"
4file = open(fd, 'r')
5text = file.read()
6print(text)
7os.close(file)
خروجی کد بالا به صورت زیر است.
Traceback (most recent call last): File "C:\Users\GFG\Desktop\FaradarsOSFile.py", line 6, in os.close(file) TypeError: an integer is required (got type _io.TextIOWrapper)
به این نکته توجه کنید که پایتون به صورت الزامی در موارد مختلف بهطور ثابت، همان خطا را بر نمیگرداند، بهخصوص اگر فایل وجود نداشته باشد یا مشکلاتی در ارتباط با مجوزها برای فایل بهوجود آمده باشد.

تابع os.rename
تابع os.rename() یکی دیگر از توابع درونی کتابخانه OS در پایتون است که برای تغییر نام فایلها استفاده میشود. با استفاده از این تابع فایل old.txt را میتوان بهسادگی به new.txt تغییر نام داد. توجه کنید که این نامها فرضی و دلخواه هستند. همچنین لازم به یادآوری است که نام فایلها فقط وقتی تغییر میکند که فایل وجود داشته باشد و کاربر مجوز معتبری را برای اعمال تغییرات در فایل داشته باشد.
به کدی که در ادامه آمده دقت کنید تا روش ساده استفاده از این تابع را ببینید.
1import os
2
3
4fd = "GFG.txt"
5os.rename(fd,'New.txt')
6os.rename(fd,'New.txt')
خروجی کد بالا به صورت زیر است.
Traceback (most recent call last): File "C:\Users\GFG\Desktop\ModuleOS\FaradarsOSFile.py", line 3, in os.rename(fd,'New.txt') FileNotFoundError: [WinError 2] The system cannot find the file specified: 'GFG.txt' -> 'New.txt'
برای درک خروجی کد بالا باید بدانیم که در ابتدا فایلی با نام GFG.txt وجود داشت. بنابراین وقتی که تابع os.rename() برای بار اول فراخوانی میشود، فایل اصلی تغییر نام میدهد. اما بهمحض اینکه تابع os.rename() برای بار دوم فراخوانی شد، از آنجا که دیگر فایلی به نام GFG.txt وجود ندارد و در عوض، فایلی به نام New.txt موجود است، بنابراین پایتون خطای FileNotFoundError را بر میگرداند.
تابع os.remove
با استفاده از کتابخانه OS میتوانیم هر فایلی را از درون سیستم با بهکار بردن متد remove() حذف کنیم. برای حذف فایل با استفاده از متد remove()، باید نام فایل را به عنوان پارامتر به متد ارسال کنیم.
به کد زیر توجه کنید. در این کد مثال سادهای از استفاده این متد را پیادهسازی کردهایم.
1import os #importing os module.
2
3os.remove("file_name.txt") #removing the file.
کتابخانه OS در پایتون مانند واسطهای بین زبان برنامهنویسی و سیستم عامل رفتار میکند. زمان کار با کتابخانه OS لازم است که حتما مسیر کامل فایلها و دایرکتوریها را به این کتابخانه ارسال کنیم. این رفتار کارایی کد نوشته شده را در هر سیستم عاملی تضمین میکند. اما ضروری است مسیر فایلها را در هر سیستم عامل بهطور دقیق متناسب با همان سیستم عامل تغییر دهیم. اگر در حذف کردن فایلی تلاش کنیم که وجود ندارد، پایتون خطای FileNotFoundErrorرا بر میگرداند.
تابع os.path.exists
با ارسال کردن نام فایلها به این متد به عنوان پارامتر، متد os.path.exists() بررسی میکند که آیا فایل مشخص شده وجود دارد یا نه. کتابخانه OS در پایتون حاوی «زیرکتابخانهای» (Sub-Module) به نام PATH است که با استفاده از این زیرکتابخانه توابع بسیار بیشتری در دسترس برنامهنویسان قرار میگیرد.
1import os
2#importing os module
3
4result = os.path.exists("file_name") #giving the name of the file as a parameter.
5
6print(result)
خروجی این کد به صورت زیر است.
False
به این دلیل که در کد بالا فایل تعریف شده برای تابع os.path.exists() وجود خارجی ندارد، کد در خروجی مقدار False بر میگرداند. اگر فایل وجود داشت این کد مقدار True را در خروجی برگشت میداد.
تابع os.path.getsize
با استفاده از متد os.path.getsize()، پایتون اندازه فایل را در واحد بایت بر میگرداند. برای استفاده از این متد باید نام فایل را بهعنوان پارامتر به متد ارسال کنیم. توجه دارید که اگر فایل در CWD قرار نداشت باید آدرس کامل به همراه نام فایل را ارسال کنیم.
1import os #importing os module
2
3size = os.path.getsize("filename")
4
5print("Size of the file is", size," bytes.")
خروجی کد بالا به صورت زیر است.
Size of the file is 192 bytes.
آموزش های تکمیلی پایتون
درصورتی که مهارتهای خود را در زبان برنامهنویسی پایتون در حد مناسبی ارتقا داده باشیم یا حتی برای اینکه متوجه شویم چه بخشهایی از دانش برنامهنویسی خود را باید تکمیل کنیم، بهترین کار بررسی دورههای حرفهایتر است. بنابراین قدم بعدی آمادهسازی خود به منظور ورود به دنیای برنامهنویسی متناسب با بازار کار خواهد بود. برای ورود به این بخش چند مورد از فیلمهای آموزشی بسیار خوب فرادرس را به شما پیشنهاد میدهیم.
- فیلم آموزش پیش بینی نوسانات بازار سهام با هوش مصنوعی در فرادرس
- فیلم آموزش بازی سازی در پایتون با کتابخانه Pygame فرادرس
- فیلم آموزش طراحی سایت و وب اپلیکیشن با فریمورک Django فرادرس

جمع بندی
در این مطلب از مجله فرادرس به بررسی کتابخانه OS در پایتون پرداختیم. این کتابخانه به عنوان ابزار قدرتمندی برای تعامل برنامههای پایتون با سیستم عامل شناخته میشود. از بررسی بعضی از کاربردهای این کتابخانه شروع کردیم و برای هر کاربرد مثالی همراه با کدنویسی نوشتیم. سپس بعضی از رایجترین توابع این کتابخانه پایتونی را معرفی کرده و برای این توابع هم مثالهای کدنویسی شدهای ارائه دادیم.
کتابخانه OS یکی از کلیدیترین و قدرتمندترین کتابخانههای پایتون است. این کتابخانه به برنامههای پایتونی امکان قابل حل بودن میدهد. یعنی برنامههای نوشته شده روی هر پلتفرمی مانند ویندوز بر روی سایر پلتفرمها مانند لینوکس و MacOS نیز میتواند کار کند. برنامههای پایتونی با کمک ابزارهای تعبیه شده در این کتابخانه کارایی بیشتری پیدا میکنند. برنامهنویسانی که به کار با این کتابخانه تسلط داشته باشند بهشکل واضحی نسبت به سایر برنامهنویسان پایتون، توانایی بیشتری خواهند داشت.