Kahibaro
Discord Login Register

فصل ۱۴: خودکارسازی با پایتون

مقدمه‌ای عملی بر خودکارسازی با پایتون

در این فصل به این می‌پردازیم که چطور می‌توانید با پایتون کارهای تکراری و خسته‌کننده را خودکار کنید. فرض می‌کنیم با مفاهیم پایهٔ پایتون (متغیر، شرط، حلقه، توابع، فایل‌ها و کتابخانه‌ها) آشنایی اولیه دارید و حالا می‌خواهید آن‌ها را برای انجام کارهای واقعی کنار هم بگذارید.

هدف این فصل:

این فصل در بخش‌های بعدی خودش جزئیات بیشتری دربارهٔ انواع خودکارسازی (کار با فایل‌ها، متن و زمان‌بندی) می‌آورد؛ در اینجا یک نگاه کلی و کاربردی داریم و نمونه‌های پایه را می‌سازیم.

خودکارسازی به زبان ساده

وقتی کاری را بارها و بارها تکرار می‌کنید (کپی/پیست، تغییر نام، مرتب‌سازی، چک کردن چیزی)، معمولاً می‌توان آن را به چند «گام مشخص» تبدیل کرد. اگر:

  1. گام‌ها مشخص و قابل توضیح باشند،
  2. ورودی و خروجی کار معلوم باشد،
  3. لازم نباشد انسان خلاقیت لحظه‌ای به خرج دهد،

بسیار احتمال دارد که بتوانید آن کار را با یک اسکریپت پایتون خودکار کنید.

خودکارسازی معمولاً این شکل را دارد:

  1. دریافت ورودی (از فایل، پوشه، اینترنت، کاربر و …)
  2. پردازش و تصمیم‌گیری (با شرط‌ها، حلقه‌ها، توابع)
  3. تولید خروجی (فایل جدید، پوشهٔ مرتب‌شده، گزارش، ایمیل، پیام و …)

الگوی کلی یک اسکریپت خودکارسازی

بیشتر اسکریپت‌های خودکارسازی یک ساختار شبیه به این دارند:

import os  # یا کتابخانه‌های دیگر موردنیاز
def main():
    # ۱. خواندن تنظیمات یا ورودی
    # ۲. انجام کار اصلی (حلقه‌ها، شرط‌ها، کار با فایل‌ها و ...)
    # ۳. نمایش نتیجه یا ذخیره در فایل
    pass
if __name__ == "__main__":
    main()

در این فصل زیاد از این الگو استفاده می‌کنیم، چون:

اگر ساختار if __name__ == "__main__": برای‌تان تازه است، کافی است در این فصل بدانید که این بخش یعنی: «اگر این فایل را مستقیم اجرا کردیم، تابع main() را صدا بزن».

انواع کارهایی که می‌توان خودکار کرد

چند دستهٔ رایج از کارهایی که مناسب خودکارسازی هستند:

در بخش‌های بعدی فصل، به‌طور خاص روی «کار با فایل‌ها»، «پردازش متن» و «زمان‌بندی» مثال خواهیم داشت. اینجا چند نمونهٔ سادهٔ کلی می‌بینید تا ذهنتان برای نوع کار آماده شود.

مثال ۱: ساخت خودکار پوشهٔ پروژه

فرض کنید هر بار که یک پروژهٔ جدید شروع می‌کنید، این کار را تکرار می‌کنید:

به‌جای این که هر بار دستی بسازید، یک‌بار اسکریپتی می‌نویسید.

import os
def create_project_structure(project_name):
    # مسیر پوشهٔ اصلی
    base_dir = project_name
    # لیست پوشه‌هایی که می‌خواهیم بسازیم
    subfolders = ["data", "src", "docs"]
    # اگر پوشهٔ اصلی وجود نداشت، بساز
    if not os.path.exists(base_dir):
        os.mkdir(base_dir)
        print(f"پوشهٔ {base_dir} ساخته شد.")
    else:
        print(f"پوشهٔ {base_dir} از قبل وجود دارد.")
    # ساخت زیردایرکتوری‌ها
    for folder in subfolders:
        path = os.path.join(base_dir, folder)
        if not os.path.exists(path):
            os.mkdir(path)
            print(f"پوشهٔ {path} ساخته شد.")
    # ساخت یک فایل README.txt خالی
    readme_path = os.path.join(base_dir, "README.txt")
    if not os.path.exists(readme_path):
        with open(readme_path, "w", encoding="utf-8") as f:
            f.write(f"پروژه: {project_name}\n")
        print("فایل README.txt ساخته شد.")
def main():
    project_name = input("نام پروژه را وارد کنید: ")
    create_project_structure(project_name)
if __name__ == "__main__":
    main()

اینجا شما:

مثال ۲: تغییر نام دسته‌جمعی فایل‌ها

کار بسیار رایج دیگر: دارید تعداد زیادی فایل با نام‌های مختلف و نامرتب، و می‌خواهید آن‌ها را یک شکل کنید. مثلاً:

import os
def rename_files(folder_path, prefix):
    files = os.listdir(folder_path)
    counter = 1
    for filename in files:
        old_path = os.path.join(folder_path, filename)
        # اگر پوشه است، رد شو
        if os.path.isdir(old_path):
            continue
        # استخراج پسوند فایل (مثلاً .jpg)
        name, ext = os.path.splitext(filename)
        new_name = f"{prefix}_{counter:03d}{ext}"
        new_path = os.path.join(folder_path, new_name)
        os.rename(old_path, new_path)
        print(f"{filename} -> {new_name}")
        counter += 1
def main():
    folder = input("مسیر پوشه را وارد کنید: ")
    prefix = input("پیشوند موردنظر برای نام فایل‌ها: ")
    rename_files(folder, prefix)
if __name__ == "__main__":
    main()

نکته‌های مهم خودکارسازی در این مثال:

مثال ۳: گزارش‌گیری ساده از فایل‌ها

فرض کنید در یک پوشه، تعداد زیادی فایل متنی دارید و می‌خواهید:

import os
def scan_text_files(folder_path):
    report_lines = []
    total_size = 0
    count = 0
    for filename in os.listdir(folder_path):
        if not filename.lower().endswith(".txt"):
            continue
        file_path = os.path.join(folder_path, filename)
        if os.path.isdir(file_path):
            continue
        size = os.path.getsize(file_path)
        total_size += size
        count += 1
        report_lines.append(f"{filename}\t{size} بایت")
    # ساختن متن گزارش
    report_text = "گزارش فایل‌های متنی\n"
    report_text += f"تعداد فایل‌ها: {count}\n"
    report_text += f"حجم کل: {total_size} بایت\n\n"
    report_text += "لیست فایل‌ها:\n"
    report_text += "\n".join(report_lines)
    # ذخیره در فایل report.txt
    report_path = os.path.join(folder_path, "report.txt")
    with open(report_path, "w", encoding="utf-8") as f:
        f.write(report_text)
    print("گزارش ساخته شد:", report_path)
def main():
    folder = input("مسیر پوشهٔ موردنظر را وارد کنید: ")
    scan_text_files(folder)
if __name__ == "__main__":
    main()

چیزی که این مثال را «خودکارسازی» می‌کند این است که:

نکته‌های مهم در طراحی اسکریپت‌های خودکارسازی

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

۱. همیشه روی داده‌های آزمایشی تست کنید

قبل از این که اسکریپت را روی «فایل‌های مهم واقعی» اجرا کنید:

۲. پیغام‌های واضح چاپ کنید

خودکارسازی نباید «جعبهٔ سیاه» ترسناک باشد. با print:

۳. از ساختار توابع استفاده کنید

به‌جای نوشتن همهٔ کد در سطح بالا:

۴. ورودی‌ها را قابل‌تنظیم کنید

به‌جای «سخت‌کد» کردن مسیرها و نام‌ها:

مثلاً:

FOLDER_PATH = "C:/Users/Me/Documents"
PREFIX = "project"
def main():
    rename_files(FOLDER_PATH, PREFIX)

۵. از خطاها نترسید، آن‌ها را مدیریت کنید

در فصل مربوط به خطاها و try/except یاد می‌گیرید چگونه خطاها را کنترل کنید. در اسکریپت‌های خودکارسازی، خطاها رایج هستند (مثلاً «فایل وجود ندارد»). ایدهٔ کلی:

try:
    # کاری که ممکن است خطا بدهد
    os.rename(old_path, new_path)
except FileNotFoundError:
    print("فایل پیدا نشد:", old_path)

در این فصل هدف فقط این است که بدانید «مدیریت خطا» در خودکارسازی بسیار مهم است.

چند ایدهٔ ساده برای خودکارسازی شخصی

برای تمرین و ایده‌گرفتن، می‌توانید پروژه‌های کوچک زیر را امتحان کنید:

در بخش‌های بعدی فصل ۱۴، به‌صورت متمرکزتر روی:

مثال‌های بیشتری خواهیم ساخت و جزئیات بیشتری خواهیم دید.

Views: 8

Comments

Please login to add a comment.

Don't have an account? Register now!