Table of Contents
مقدمهای عملی بر خودکارسازی با پایتون
در این فصل به این میپردازیم که چطور میتوانید با پایتون کارهای تکراری و خستهکننده را خودکار کنید. فرض میکنیم با مفاهیم پایهٔ پایتون (متغیر، شرط، حلقه، توابع، فایلها و کتابخانهها) آشنایی اولیه دارید و حالا میخواهید آنها را برای انجام کارهای واقعی کنار هم بگذارید.
هدف این فصل:
- دیدن نمونههای واقعیِ «اسکریپتهای خودکارسازی»
- یاد گرفتن چند الگوی رایج برای خودکارسازی
- آشنایی با چند کتابخانهٔ کاربردی (فقط در حد استفادهٔ ساده)
- ایده گرفتن برای پروژههای شخصی خودکارسازی
این فصل در بخشهای بعدی خودش جزئیات بیشتری دربارهٔ انواع خودکارسازی (کار با فایلها، متن و زمانبندی) میآورد؛ در اینجا یک نگاه کلی و کاربردی داریم و نمونههای پایه را میسازیم.
خودکارسازی به زبان ساده
وقتی کاری را بارها و بارها تکرار میکنید (کپی/پیست، تغییر نام، مرتبسازی، چک کردن چیزی)، معمولاً میتوان آن را به چند «گام مشخص» تبدیل کرد. اگر:
- گامها مشخص و قابل توضیح باشند،
- ورودی و خروجی کار معلوم باشد،
- لازم نباشد انسان خلاقیت لحظهای به خرج دهد،
بسیار احتمال دارد که بتوانید آن کار را با یک اسکریپت پایتون خودکار کنید.
خودکارسازی معمولاً این شکل را دارد:
- دریافت ورودی (از فایل، پوشه، اینترنت، کاربر و …)
- پردازش و تصمیمگیری (با شرطها، حلقهها، توابع)
- تولید خروجی (فایل جدید، پوشهٔ مرتبشده، گزارش، ایمیل، پیام و …)
الگوی کلی یک اسکریپت خودکارسازی
بیشتر اسکریپتهای خودکارسازی یک ساختار شبیه به این دارند:
import os # یا کتابخانههای دیگر موردنیاز
def main():
# ۱. خواندن تنظیمات یا ورودی
# ۲. انجام کار اصلی (حلقهها، شرطها، کار با فایلها و ...)
# ۳. نمایش نتیجه یا ذخیره در فایل
pass
if __name__ == "__main__":
main()در این فصل زیاد از این الگو استفاده میکنیم، چون:
- فهم کد را سادهتر میکند
- امکان استفادهٔ مجدد از توابع را میدهد
- اگر بعداً بخواهید این کد را در برنامهٔ دیگری استفاده کنید، راحتتر خواهد بود
اگر ساختار if __name__ == "__main__": برایتان تازه است، کافی است در این فصل بدانید که این بخش یعنی: «اگر این فایل را مستقیم اجرا کردیم، تابع main() را صدا بزن».
انواع کارهایی که میتوان خودکار کرد
چند دستهٔ رایج از کارهایی که مناسب خودکارسازی هستند:
- کار با فایلها و پوشهها:
- مرتبسازی فایلها بر اساس نوع یا تاریخ
- تغییر نام دستهجمعی فایلها
- پیدا کردن فایلهای تکراری
- پردازش متن:
- تمیز کردن فایلهای متنی (حذف فاصلههای اضافه، تغییر فرمت)
- جستوجو و جایگزینی عبارات در صدها فایل
- گزارشگیری:
- خواندن دادهها از فایلها و ساختن گزارش ساده (مثلاً جمع زدن، شمارش)
- کارهای تکراری روزمره:
- ساخت پوشهٔ پروژه با ساختار ثابت
- تولید خودکار نام فایلها (مثلاً صورتحسابها با تاریخ)
- کار با وب و شبکه (در سطح ساده):
- دانلود خودکار چند فایل از اینترنت
- چک کردن یک آدرس وب و ذخیرهٔ نتیجه (مثلاً قیمت یا وضعیت سرویس)
در بخشهای بعدی فصل، بهطور خاص روی «کار با فایلها»، «پردازش متن» و «زمانبندی» مثال خواهیم داشت. اینجا چند نمونهٔ سادهٔ کلی میبینید تا ذهنتان برای نوع کار آماده شود.
مثال ۱: ساخت خودکار پوشهٔ پروژه
فرض کنید هر بار که یک پروژهٔ جدید شروع میکنید، این کار را تکرار میکنید:
- ساخت یک پوشهٔ اصلی با نام پروژه
- ساخت زیردایرکتوریها مثل:
data،src،docs - ایجاد یک فایل خالی مثل
README.txt
بهجای این که هر بار دستی بسازید، یکبار اسکریپتی مینویسید.
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()اینجا شما:
- یک کار تکراری واقعی را به کد تبدیل کردهاید.
- از کتابخانهٔ
osبرای کار با پوشهها استفاده کردهاید. - با یک ورودی ساده (نام پروژه)، چند کار خودکار انجام میدهید.
مثال ۲: تغییر نام دستهجمعی فایلها
کار بسیار رایج دیگر: دارید تعداد زیادی فایل با نامهای مختلف و نامرتب، و میخواهید آنها را یک شکل کنید. مثلاً:
IMG_001.jpg,IMG_002.jpg, ...- و شما میخواهید تبدیل شوند به:
travel_001.jpg,travel_002.jpg, ...
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()نکتههای مهم خودکارسازی در این مثال:
- همیشه قبل از اجرای اسکریپتهای تغییرنام، از فایلها نسخهٔ پشتیبان بگیرید.
- ابتدا اسکریپت را روی یک پوشهٔ آزمایشی با چند فایل تست کنید.
- پیغامهایی که چاپ میکنید (
print) کمک میکند ببینید اسکریپت دقیقاً چه کار کرده است.
مثال ۳: گزارشگیری ساده از فایلها
فرض کنید در یک پوشه، تعداد زیادی فایل متنی دارید و میخواهید:
- بدانید چند فایل
txtوجود دارد، - مجموع اندازهٔ آنها را حساب کنید،
- لیست آنها را در یک فایل گزارش ذخیره کنید.
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:
- قبل و بعد از کارهای مهم، پیغام چاپ کنید.
- اگر خطایی رخ میدهد، پیام قابلفهم بدهید.
- نمایش دهید که چه فایلهایی تغییر کردهاند یا ایجاد شدهاند.
۳. از ساختار توابع استفاده کنید
بهجای نوشتن همهٔ کد در سطح بالا:
- برای هر کار مشخص (مثل «تغییر نام فایلها»، «نوشتن گزارش»، «ساخت پوشهها») یک تابع بنویسید.
- این کار اشکالزدایی و استفادهٔ مجدد را سادهتر میکند.
۴. ورودیها را قابلتنظیم کنید
بهجای «سختکد» کردن مسیرها و نامها:
- از ورودی کاربر (
input) استفاده کنید، - یا از متغیرهایی در بالای فایل که راحت میتوان آنها را عوض کرد.
مثلاً:
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)در این فصل هدف فقط این است که بدانید «مدیریت خطا» در خودکارسازی بسیار مهم است.
چند ایدهٔ ساده برای خودکارسازی شخصی
برای تمرین و ایدهگرفتن، میتوانید پروژههای کوچک زیر را امتحان کنید:
- اسکریپت ساخت پوشهٔ روزانه:
- هر روز که اجرا میشود، پوشهای با تاریخ امروز بسازد (مثلاً
2025-12-26) و داخلش پوشههایnotes,images، و یک فایل خالیtodo.txt. - مرتبسازی فایلهای دانلود:
- در پوشهٔ Downloads، فایلها را بر اساس پسوند، به پوشههایی مثل
Images,Docs,Videosمنتقل کند. - تمیز کردن فایلهای متنی:
- همهٔ فایلهای
txtدر یک پوشه را باز کند، فاصلههای اضافی انتهای هر خط را حذف کند و دوباره ذخیره کند. - تولید گزارش روزانهٔ کار:
- از روی یک فایل متنی ساده که در طول روز پر میکنید، یک گزارش خلاصه بسازد (مثلاً تعداد خطها، تعداد کارهای انجامشده و …).
در بخشهای بعدی فصل ۱۴، بهصورت متمرکزتر روی:
- خودکار کردن وظایف ساده،
- کار با فایلها و پوشهها،
- خودکارسازی پردازش متن،
- و زمانبندی اجرای اسکریپتها
مثالهای بیشتری خواهیم ساخت و جزئیات بیشتری خواهیم دید.