Milad Mobaseri
enfa
از کار دستی خسته‌کننده بین انبوه پرونده‌ها تا مرتب شدن خودکار کارها با کمک یک ربات
پایتون

اتوماسیون با پایتون: کارهای تکراری رو چطور خودکار کنیم؟

هر روز کلی وقت پای کارهای تکراری می‌ذاری؟ از مرتب کردن فایل و یکی کردن اکسل تا گزارش زمان‌بندی‌شده، و شش درسی که فقط بعد از ساختن اتوماسیون‌های واقعی یاد گرفتم.

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

هر کدوم از این کارها شاید چند دقیقه بیشتر طول نکشه، ولی وقتی هر روز تکرار می‌شن، کم‌کم یه تیکه‌ی جدی از وقتت رو می‌خورن؛ تازه هر بار هم احتمال اشتباه هست.

بخش بزرگی از کار من ساختن همین اتوماسیون‌ها بوده؛ از اسکریپت‌های کوچیک تا سیستم‌هایی که شبانه‌روز و بدون نظارت اجرا می‌شن. توی این مقاله دو تا چیز بهت می‌دم: اول اینکه اتوماسیون با پایتون رو از کجا و با چه کارهایی شروع کنی، و دوم شش تا درسی که فقط بعد از ساختن اتوماسیون‌های واقعی یاد گرفتم و توی هیچ آموزشی ندیده بودم.

اول بپرس: اصلاً ارزشش رو داره؟

هر کاری که تکرار می‌شه، لزوماً ارزش برنامه‌نویسی نداره. گاهی ساختن ابزار برای یه کار دودقیقه‌ای، از خود اون کار وقت بیشتری می‌گیره.

یه حساب ساده: کاری که روزی ۲۰ دقیقه وقت می‌گیره و ماهی ۲۰ روز تکرار می‌شه، یعنی حدود ۶ ساعت و ۴۰ دقیقه در ماه. اگه ساختن ابزارش ۴ ساعت طول بکشه، از ماه دوم داری سود می‌کنی. ولی کاری که ماهی یه بار و پنج دقیقه طول می‌کشه، احتمالاً اصلاً ارزش کد نوشتن نداره.

ترازویی که کفه‌ی ساعت‌های صرف کار تکراری‌اش از جعبه‌ابزار ساخت اتوماسیون سنگین‌تر است

صرفه‌جویی واقعی = زمان دستی که حذف می‌شه − زمان ساخت و نگهداری

و اون «نگهداری» رو دست‌کم نگیر؛ پایین‌تر می‌بینی چرا.

یه نکته‌ی مهم دیگه هم هست: خودکار کردن یه روند اشتباه، فقط باعث می‌شه همون اشتباه سریع‌تر تکرار بشه. پس قبل از کد نوشتن، مطمئن شو روش فعلی خودش منطقیه.

سه تا کار خوب برای شروع اتوماسیون با پایتون

۱. مرتب کردن فایل‌ها

ساده‌ترین نقطه‌ی شروع، پوشه‌ایه که پر از PDF و عکس و اکسل قاطی‌پاتیه. این برنامه فایل‌ها رو بر اساس پسوند توی پوشه‌های جدا می‌چینه و فقط از کتابخونه‌های خود پایتون استفاده می‌کنه؛ یعنی چیزی لازم نیست نصب کنی:

from pathlib import Path

import shutil



folder = Path("downloads")



categories = {

    ".pdf": "pdf",

    ".jpg": "images",

    ".png": "images",

    ".xlsx": "spreadsheets",

    ".csv": "spreadsheets",

}



for file_path in folder.iterdir():

    if not file_path.is_file():

        continue



    category = categories.get(file_path.suffix.lower())

    if category is None:

        continue



    target_folder = folder / category

    target_folder.mkdir(exist_ok=True)



    destination = target_folder / file_path.name

    if destination.exists():

        print(f"Skipped (already exists): {file_path.name}")

        continue



    shutil.move(file_path, destination)

    print(f"Moved: {file_path.name} -> {category}/")



print("Done.")

این دقیقاً خروجی همین کد روی یه پوشه‌ی آزمایشیه:

پوشه‌ی دانلود قبل و بعد از اجرای اسکریپت پایتون؛ فایل‌ها بر اساس پسوند در پوشه‌های pdf، images و spreadsheets مرتب شده‌اند

دقت کن که فایل‌هایی که پسوندشون توی فهرست نیست (مثل notes.txt) دست نمی‌خورن، و اگه فایلی با همون اسم توی مقصد باشه، روش نوشته نمی‌شه. همیشه اول روی یه پوشه‌ی آزمایشی اجراش کن.

۲. یکی کردن فایل‌های اکسل و CSV

اگه هر هفته چند تا فایل فروش یا گزارش رو کنار هم می‌ذاری، pandas این کار رو چند ثانیه‌ای انجام می‌ده:

from pathlib import Path

import pandas as pd



files = sorted(Path("sales").glob("*.csv"))

if not files:

    raise FileNotFoundError("No CSV files found in sales/")



frames = []

expected = None



for file in files:

    df = pd.read_csv(file)



    if expected is None:

        expected = list(df.columns)

    elif list(df.columns) != expected:

        raise ValueError(f"{file.name}: columns {list(df.columns)} != {expected}")



    frames.append(df)



combined = pd.concat(frames, ignore_index=True)

combined.to_csv("combined_sales.csv", index=False)



print(f"{len(files)} files, {len(combined)} rows")

اون چکِ ستون‌ها عمدیه. اگه یکی از فایل‌ها ستونش اسم دیگه‌ای داشته باشه (مثلاً price به‌جای amount)، pandas بدون هیچ خطایی یه ستون خالی جدید می‌سازه و گزارشت بی‌صدا خراب می‌شه. این‌جوری همون اول می‌فهمی.

یه وسوسه‌ی رایج هم اینه که ردیف‌های تکراری رو با drop_duplicates پاک کنی. حواست باشه دو تا ردیف که ظاهرشون یکیه، ممکنه دو تا تراکنش واقعی و جدا باشن.

۳. گزارشی که خودش ساعت ۸ صبح اجرا می‌شه

تا وقتی هر بار خودت باید برنامه رو اجرا کنی، کار نصفه خودکاره. نیمه‌ی دیگه، زمان‌بندیه.

شب، صاحب کار خواب است و صبح، ربات گزارش آماده را کنار قهوه روی میز گذاشته

روی لینوکس با cron؛ این خط برنامه رو هر روز ساعت ۸ صبح اجرا می‌کنه:

0 8 * * * /path/to/venv/bin/python /path/to/report.py >> /path/to/report.log 2>&1

اون تیکه‌ی آخر (>> report.log 2>&1) رو جا ننداز. بدون اون، اگه برنامه یه روز خطا بده، خروجی و خطا هیچ‌جا نمی‌مونه و هیچ‌وقت نمی‌فهمی.

روی ویندوز با Task Scheduler: یه Basic Task بساز، زمانش رو Daily و ساعت ۸ بذار، توی بخش Action گزینه‌ی Start a program رو بزن؛ توی Program مسیر python.exe محیط مجازیت، توی Arguments مسیر کامل report.py و توی Start in پوشه‌ی پروژه رو بنویس.

وب و تلگرام چی؟

جمع کردن اطلاعات از سایت‌ها و ساختن ربات تلگرام هم از کاربردهای خیلی رایج اتوماسیون با پایتون هستن، ولی هر کدوم دنیای خودشون رو دارن. درباره‌ی اینکه کی اسکرپینگ ارزش داره، وب اسکرپینگ چیست و چه زمانی ارزش دارد؟ رو بخون، و اگه رباتت با زیاد شدن کاربرها کند شده، چرا ربات تلگرام با افزایش کاربر کند می‌شود؟ رو.

شش درسی که از اتوماسیون‌های واقعی گرفتم

اسکریپت‌های بالا روی کامپیوتر خودت و با داده‌ی خودت اجرا می‌شن، پس اگه خراب بشن، خودت همون لحظه می‌بینی. ولی اتوماسیون معمولاً همین‌جا نمی‌مونه.

فرض کن همون گزارش ساعت ۸ صبح بزرگ‌تر شده: حالا داده‌ی فروش رو از پنل فروشگاه می‌گیره، تراکنش‌ها رو از درگاه پرداخت، و آخرش گزارش رو برای مدیر می‌فرسته. هر روز، بدون اینکه کسی بالای سرش باشه. اینجاست که مشکلات واقعی شروع می‌شن، و این شش درس دقیقاً مال همین مرحله‌ست.

۱. اتوماسیون باید بفهمه کی کارش تموم شده

اسکریپت گزارش یه قانون ساده داره: «اگه ارسال گزارش خطا داد، صبر کن و دوباره تلاش کن.» قانون خوبیه، تا روزی که سرویس ارسال، گزارش رو با موفقیت می‌فرسته ولی جوابش رو با یه عبارت تازه برمی‌گردونه که اسکریپت نمی‌شناسه.

اسکریپت فکر می‌کنه خطاست و دوباره می‌فرسته؛ و دوباره، و دوباره. نتیجه؟ مدیر صبح با چند ده نسخه از همون گزارش توی صندوقش از خواب بیدار می‌شه.

رباتی که با وجود علامت موفقیت پشت سرش، مدام دکمه را می‌زند و کاغذ تولید می‌کند

قانون: «هیچ‌وقت تسلیم نشو» یه نیمه‌ی دوم داره که راحت یادت می‌ره: حالت‌هایی که کار رو تموم می‌کنن (موفقیت، رد قطعی، توقف دستی) باید همه‌شون شناخته بشن. هر جوابی که اسکریپت نمی‌شناسه، باید مثل یه باگ دیده بشه، نه یه خطای معمولی که باید دوباره امتحانش کرد.

۲. سکوت یعنی مرده

اسکریپت از درگاه پرداخت خروجی تراکنش‌ها رو درخواست می‌کنه. درگاه می‌گه «فایل آماده می‌شه و لینکش رو برات می‌فرستم»، و این گاهی چند دقیقه طول می‌کشه. اسکریپت هم توی این مدت هیچی چاپ نمی‌کنه.

همکارت پنجره‌ی ساکن رو می‌بینه، فکر می‌کنه هنگ کرده و متوقفش می‌کنه؛ در حالی که اسکریپت فقط چند ثانیه با ادامه‌ی کار فاصله داشت.

ربات بی‌صدا منتظر پیام است و همکار نگران، انگشتش روی دکمه‌ی توقف

قانون: اگه کسی نتونه فرق «دارم صبر می‌کنم» و «گیر کردم» رو ببینه، عملاً گیر کرده؛ چون دستش می‌ره سمت دکمه‌ی توقف. هر انتظاری که از چند ثانیه بیشتره باید بگه منتظر چیه و بعدش چی کار می‌کنه. یه خط ساده توی هر دور کافیه؛ نه شمارنده، نه تایمر پیچیده.

۳. متن نمایشی برای آدمه، نه برای تصمیم گرفتن

پنل فروشگاه کنار محصولی که هنوز به انبار نرسیده می‌نویسه «ناموجود»؛ همون کلمه‌ای که برای محصول حذف‌شده هم استفاده می‌کنه. اگه اسکریپت از روی همین کلمه تصمیم بگیره، محصولی رو که فردا میاد از گزارش موجودی حذف می‌کنه.

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

۴. اندازه بگیر، حدس نزن

هر سرویسی که بهش وصل می‌شی، محدودیت‌های خودش رو داره و این محدودیت‌ها معمولاً جایی نوشته نشدن. یکی چند درخواست در ثانیه رو راحت جواب می‌ده، یکی دیگه اگه تند بری، چند دقیقه‌ای مسدودت می‌کنه، و سومی به تعداد حساس نیست ولی وقتی کل داده رو یه‌جا بخوای، کند می‌شه یا جواب نمی‌ده.

سه در با رفتار متفاوت: یکی باز، یکی بسته با مانع و یکی گیرکرده با بسته‌ی بزرگ؛ کسی با کرنومتر اندازه می‌گیرد

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

۵. دلیل واقعی رو تا خود آدم برسون

لاگی که فقط می‌نویسه «خطا در دریافت داده» تقریباً به هیچ دردی نمی‌خوره. ممکنه پشتش یه جمله‌ی کاملاً روشن قایم شده باشه، مثل «توکن دسترسی منقضی شده»، که با یه بار ورود دوباره حل می‌شد.

قانون: متن واقعی‌ای که سرویس برگردونده رو چاپ کن. و شاخه‌ی پیش‌فرض کدت رو «ناشناخته» بنام، نه «غیرمنتظره»؛ چون اون شاخه نشون می‌ده قانون‌های تو کامل نیست، نه اینکه سرویس بدرفتاری کرده.

۶. «بدون خطا اجرا شد» با «درست کار کرد» یکی نیست

فرض کن یه روز اسم پوشه‌ی فایل‌های فروش عوض می‌شه. اسکریپت یکی کردن CSV، اگه اون چک اول رو نداشته باشه، صفر فایل پیدا می‌کنه، یه گزارش خالی می‌سازه و بدون هیچ خطایی تموم می‌شه. همه‌چی سبزه، ولی گزارش اون روز هیچی توش نیست.

همین درس توی داده‌ها هم هست: اسکریپتی که بدون خطا تموم می‌شه ممکنه کلی داده‌ی غلط ذخیره کرده باشه. (توی مقاله‌ی وب اسکرپینگ تعریف کردم که این دقیقاً چه بلایی سر اسکرپر دیجی‌کالای من آورد.)

قانون: هر مرحله باید بگه چند تا چیز رو پردازش یا بررسی کرده، نه فقط اینکه شکایتی نداشته. واسه همینه که کد یکی کردن CSV بالا آخرش تعداد فایل‌ها و ردیف‌ها رو چاپ می‌کنه: «۰ فایل» رو همون لحظه می‌بینی، «OK» رو نه.

از کجا شروع کنی؟

یه کار مشخص انتخاب کن؛ نه پنج تا با هم. یه فایل اکسل، یه پوشه‌ی شلوغ یا یه گزارش روزانه نقطه‌ی شروع خوبیه.

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

اگه مسئله ساده‌ست، از کتابخونه‌های خود پایتون شروع کن؛ برای داده‌ها برو سراغ pandas، و اگه باید سر ساعت اجرا بشه، زمان‌بندی رو اضافه کن. از روز اول دیتابیس و داشبورد و API لازم نداری؛ وقتی نیاز واقعی معلوم شد، اضافه‌شون کن.

جمع‌بندی

اتوماسیون با پایتون می‌تونه کلی از کارهای روزمره‌ت رو ساده کنه؛ از مرتب کردن فایل و یکی کردن اکسل تا گزارشی که خودش صبح‌ها آماده می‌شه.

ولی ارزش یه اتوماسیون به تعداد خط‌های کدش نیست؛ به اینه که یه مسئله‌ی واقعی رو حل کنه و با گذشت زمان قابل‌اعتماد بمونه. و قابل‌اعتماد بودن یعنی بدونه کی کارش تموم شده، ساکت نمونه، به جای حدس اندازه بگیره و وقتی چیزی رو نمی‌شناسه، بگه.

اگه یه فرایند کاری داری که می‌خوای جدی و قابل‌اعتماد خودکار بشه، خدمات اتوماسیون و استخراج داده‌م رو ببین.

سؤالات متداول

برای شروع اتوماسیون با پایتون باید برنامه‌نویس حرفه‌ای باشم؟

نه. برای کارهای ساده مثل مرتب کردن فایل یا یکی کردن CSV، آشنایی مقدماتی با متغیر، شرط، حلقه و کار با فایل کافیه. هر چی اتوماسیون جدی‌تر بشه و بیشتر بدون نظارت اجرا بشه، مدیریت خطا و لاگ مهم‌تر می‌شه.

چه کارهایی رو می‌شه با پایتون خودکار کرد؟

مدیریت فایل، پردازش اکسل و CSV، جمع‌آوری داده از وب، ساختن گزارش، فرستادن اعلان، کار با APIها و خیلی از کارهای تکراری اداری. اینکه هر کار چقدر راحت خودکار می‌شه، به این بستگی داره که مراحلش چقدر قابل‌پیش‌بینی‌ان.

برای اجرای خودکار برنامه‌ی پایتون حتماً سرور لازمه؟

نه. برنامه‌های ساده روی کامپیوتر خودت هم با Task Scheduler ویندوز یا cron اجرا می‌شن، به شرطی که کامپیوتر اون ساعت روشن باشه. اگه باید شبانه‌روز اجرا بشه یا دیگران هم ازش استفاده کنن، سرور انتخاب بهتریه.

#اتوماسیون#بهره‌وری#وب اسکرپینگ#پایتون#پردازش فایل