کتابخانه os در پایتون
ماژول os یکی از پایهایترین و پرکاربردترین ماژولهای پایتون برای تعامل با سیستمعامل است. این کتابخانه امکاناتی برای مدیریت فایلها و دایرکتوریها، خواندن و تنظیم متغیرهای محیطی، کشف مشخصات پلتفرم و اجرای عملیات سطح پایین را فراهم میکند. در این مقاله به شکل عملی و دقیق با توابع مهم، نکات عملکردی و ریزهکاریهای کراسپلتفرم آشنا میشویم.
چرا از os استفاده کنیم؟
os به شما امکان میدهد کدی بنویسید که بتواند روی ویندوز، لینوکس و macOS کار کند. با استفاده از توابع این ماژول میتوانید مسیرها را بسازید، فایلها را حذف یا تغییر نام دهید، سطح دسترسی را تغییر دهید و اطلاعات محیطی را استخراج کنید.
ساختار کلی و توابع پایه
os.name— نام خام سیستم (مثل ‘posix’ یا ‘nt’).os.getcwd()— مسیر کاری فعلی.os.chdir(path)— تغییر مسیر کاری.os.listdir(path)— فهرست فایلها و پوشهها.os.mkdir(path),os.makedirs(path)— ایجاد دایرکتوری.os.remove(path),os.rmdir(path)— حذف فایل یا پوشه (توجه به خالی بودن).os.rename(src, dst),os.replace(src, dst)— تغییر نام یا جابجایی (replace اتمیک است).
مدیریت مسیرها: os.path
زیرماژول os.path برای کار با مسیرها طراحی شده است و از تفاوتهای جداکننده مسیر بین پلتفرمها مراقبت میکند.
| توابع | کاربرد |
|---|---|
| os.path.join | ترکیب بخشهای مسیر به صورت امن و کراسپلتفرم |
| os.path.exists | بررسی وجود فایل یا پوشه |
| os.path.isdir / isfile | تشخیص پوشه یا فایل |
| os.path.abspath | مسیر کامل (absolute) |
نمونه: پیمایش دایرکتوری و فیلتر کردن فایلها
import os
root = '/path/to/folder'
for dirpath, dirnames, filenames in os.walk(root):
for name in filenames:
if name.endswith('.py'):
full_path = os.path.join(dirpath, name)
print(full_path)این کد با استفاده از os.walk کل ساختار پوشه را پیمایش کرده و تمامی فایلهای با پسوند .py را چاپ میکند. استفاده از os.path.join تضمین میکند که جداکنندهها متناسب با پلتفرم درست باشند.
سرعت و بهینگی: os.scandir
اگر نیاز به پیمایش سریع دایرکتوری دارید، از os.scandir به جای os.listdir استفاده کنید؛ بهویژه زمانی که قرار است متادیتا (مانند اینکه آیا آیتم پوشه است) بررسی شود. scandir باعث کاهش فراخوانیهای سیستمی و بهبود کارایی میشود.
import os
with os.scandir('.') as it:
for entry in it:
if entry.is_file() and entry.name.endswith('.log'):
print(entry.path)در این مثال، os.scandir اطلاعات بهینهای از هر ورودی ارائه میدهد و بررسی اینکه یک آیتم فایل است با متد is_file() سریعتر انجام میشود.
کار با متغیرهای محیطی
متغیرهای محیطی (Environment Variables) نقش مهمی در پیکربندی برنامهها دارند. os اجازه خواندن، نوشتن و حذف آنها را میدهد.
import os
# خواندن با مقدار پیشفرض
db_host = os.environ.get('DB_HOST', 'localhost')
# تنظیم متغیر محیطی در زمان اجرا
os.environ['MY_SETTING'] = 'value'با os.environ.get میتوان مقدار را با یک مقدار پیشفرض خواند تا از خطای KeyError جلوگیری شود. توجه داشته باشید که تغییر os.environ فقط در پروسه جاری تاثیر دارد مگر اینکه در سطح سیستم بهصورت دائم تنظیم شود.
مجوزها و مالکیت
توابعی مانند os.chmod، os.stat و os.getuid/os.getgid برای کار با سطح دسترسی و اطلاعات فایل استفاده میشوند. روی ویندوز برخی توابع رفتاری متفاوت دارند یا محدودیت دارند.
import os
import stat
path = 'script.sh'
# اضافه کردن دسترسی اجرایی برای مالک
st = os.stat(path)
os.chmod(path, st.st_mode | stat.S_IXUSR)در این نمونه، ابتدا حالتهای فعلی فایل با os.stat گرفته میشود و سپس با عملگر بیتوار حق اجرای مالک به مجوزها افزوده میشود. این کار نسبت به تنظیم مجوزها از صفر امنتر است چون سایر بیتها را حفظ میکند.
اجرای دستورات سیستم — نکات امنیتی
قدیمتر از os.system برای اجرای دستورهای شل استفاده میشد، اما توصیه میشود از ماژول subprocess استفاده کنید تا کنترل و امنیت بیشتری داشته باشید. استفاده از os.system در مقابل ورودیهای کاربر میتواند باعث حملات تزریق شود.
نکات کراسپلتفرم و بهترین شیوهها
- برای ساخت مسیرها همیشه از
os.path.joinاستفاده کنید تا از جداکنندهها مطمئن باشید. - برای عملیات اتمیک روی فایلها از
os.replaceیا کتابخانههای higher-level استفاده کنید. - برای پیمایشهای بزرگ از
os.scandirاستفاده کنید تا حافظه و زمان اجرای کمتری مصرف شود. - قبل از حذف یا تغییر نام فایل،
os.path.existsوos.accessرا بررسی کنید؛ مخصوصاً وقتی اسکریپت با مجوزهای بالا اجرا میشود.
مثال ترکیبی: جایگزینی اتمیک فایل خروجی
import os
def atomic_write(path, data):
tmp = path + '.tmp'
with open(tmp, 'w', encoding='utf-8') as f:
f.write(data)
# جایگزینی اتمیک (تعویض فایل هدف با فایل موقت)
os.replace(tmp, path)این تابع ابتدا محتوا را در فایل موقتی مینویسد و سپس با os.replace جایگزینی اتمیک انجام میدهد. اگر در نوشتن خطایی رخ دهد، فایل هدف دستنخورده باقی میماند؛ این روش برای جلوگیری از فایلهای نیمهنوشتهشده بسیار کاربردی است.
مقایسه کوتاه: os در برابر pathlib
ماژول pathlib API شیءمحور و خواناتری برای کار با مسیرها ارائه میدهد و در بسیاری از موارد جایگزینی زیبا برای os.path است. با این حال، توابع سطح سیستمی مانند os.replace، os.chmod و os.scandir هنوز کاربرد گستردهای دارند.
جمعبندی و توصیههای حرفهای
ماژول os ابزار اصلی برای تعامل با سیستمعامل در پایتون است. یادگیری دقیق توابع آن (و تفاوتهای رفتاری بین پلتفرمها) به شما امکان میدهد برنامههای قابلاعتماد و پرکارایی بنویسید. همیشه اولویت با استفاده از APIهای امنتر و سطح بالاتر (مثل subprocess و pathlib) است و در موارد نیاز به کارایی از scandir و replace بهره ببرید.
اگر میخواهید مثالهای بیشتری برای سناریوهای خاص (مثل مانیتورینگ پوشه، کار با فایلهای باینری یا ترکیب با threaded I/O) ببینید، مشخص کنید تا نمونههای کاربردی بیشتری آماده کنم.
آیا این مطلب برای شما مفید بود ؟




