ویژگی تصویر

کتابخانه os در پایتون — راهنمای کامل برای کار با فایل، پوشه و سیستم‌عامل

  /  پایتون   /  کتابخانه 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) ببینید، مشخص کنید تا نمونه‌های کاربردی بیشتری آماده کنم.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: