اگه هر روز یه سری کار مشخص رو پشت سر هم انجام میدی، احتمالاً حداقل یه بار به این فکر کردی که کاش میشد همهشون رو خودکار کرد. چند تا فایل رو تغییر نام بدی، اطلاعات چند تا فایل اکسل رو کنار هم بذاری یا گزارشی بسازی که هر بار تقریباً همون شکله.
هر کدوم از این کارها شاید چند دقیقه بیشتر طول نکشه، ولی وقتی هر روز تکرار میشن، کمکم یه تیکهی جدی از وقتت رو میخورن؛ تازه هر بار هم احتمال اشتباه هست.
بخش بزرگی از کار من ساختن همین اتوماسیونها بوده؛ از اسکریپتهای کوچیک تا سیستمهایی که شبانهروز و بدون نظارت اجرا میشن. توی این مقاله دو تا چیز بهت میدم: اول اینکه اتوماسیون با پایتون رو از کجا و با چه کارهایی شروع کنی، و دوم شش تا درسی که فقط بعد از ساختن اتوماسیونهای واقعی یاد گرفتم و توی هیچ آموزشی ندیده بودم.
اول بپرس: اصلاً ارزشش رو داره؟
هر کاری که تکرار میشه، لزوماً ارزش برنامهنویسی نداره. گاهی ساختن ابزار برای یه کار دودقیقهای، از خود اون کار وقت بیشتری میگیره.
یه حساب ساده: کاری که روزی ۲۰ دقیقه وقت میگیره و ماهی ۲۰ روز تکرار میشه، یعنی حدود ۶ ساعت و ۴۰ دقیقه در ماه. اگه ساختن ابزارش ۴ ساعت طول بکشه، از ماه دوم داری سود میکنی. ولی کاری که ماهی یه بار و پنج دقیقه طول میکشه، احتمالاً اصلاً ارزش کد نوشتن نداره.

صرفهجویی واقعی = زمان دستی که حذف میشه − زمان ساخت و نگهداری
و اون «نگهداری» رو دستکم نگیر؛ پایینتر میبینی چرا.
یه نکتهی مهم دیگه هم هست: خودکار کردن یه روند اشتباه، فقط باعث میشه همون اشتباه سریعتر تکرار بشه. پس قبل از کد نوشتن، مطمئن شو روش فعلی خودش منطقیه.
سه تا کار خوب برای شروع اتوماسیون با پایتون
۱. مرتب کردن فایلها
سادهترین نقطهی شروع، پوشهایه که پر از 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.")
این دقیقاً خروجی همین کد روی یه پوشهی آزمایشیه:

دقت کن که فایلهایی که پسوندشون توی فهرست نیست (مثل 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 اجرا میشن، به شرطی که کامپیوتر اون ساعت روشن باشه. اگه باید شبانهروز اجرا بشه یا دیگران هم ازش استفاده کنن، سرور انتخاب بهتریه.
