Table of Contents
ایده کلی این بخش
در فصل «خودکارسازی با پایتون» با مفهوم خودکارسازی و چند حالت رایج آن آشنا شدهاید (مثل کار با فایلها، متن و زمانبندی).
در این بخش میخواهیم چند نمونهٔ واقعی و ساده ببینیم که میتوانید تقریباً بلافاصله بعد از این دوره در زندگی روزمره استفاده کنید.
توجه: کدها سادهاند و هدف، ایده گرفتن است؛ بعداً میتوانید آنها را با چیزهایی که در فصلهای دیگر یاد میگیرید حرفهایتر کنید.
مثال ۱: مرتبسازی خودکار فایلها در یک پوشه
فرض کنید پوشهٔ «دانلودها» پر از فایلهای مختلف است: عکس، PDF، فایلهای zip و …
میخواهیم با یک اسکریپت پایتون، این فایلها را بر اساس پسوندشان در پوشههای جدا بریزیم.
ایده:
- ساخت پوشههایی مثل
Images,Documents,Zips - تشخیص نوع فایل با توجه به پسوند (
.jpg,.png,.pdf,.zip, …) - جابهجا کردن فایل به پوشهٔ مناسب
import os
import shutil
# مسیر پوشهای که میخواهید مرتب شود (مثال: پوشه دانلودها)
folder_path = r"C:\Users\YourName\Downloads"
# تعریف گروههای پسوند
file_types = {
"Images": [".jpg", ".jpeg", ".png", ".gif"],
"Documents": [".pdf", ".docx", ".txt"],
"Zips": [".zip", ".rar"],
}
# ساخت پوشهها اگر وجود نداشته باشند
for folder_name in file_types.keys():
new_folder_path = os.path.join(folder_path, folder_name)
if not os.path.exists(new_folder_path):
os.mkdir(new_folder_path)
# پیمایش فایلهای پوشه
for file_name in os.listdir(folder_path):
file_path = os.path.join(folder_path, file_name)
# اگر خودش پوشه است، رد شو
if os.path.isdir(file_path):
continue
# استخراج پسوند
_, ext = os.path.splitext(file_name)
# پیدا کردن پوشه مناسب برای این پسوند
for folder_name, extensions in file_types.items():
if ext.lower() in extensions:
dest_path = os.path.join(folder_path, folder_name, file_name)
print(f"در حال انتقال {file_name} به {folder_name}")
shutil.move(file_path, dest_path)
breakنکتهها:
- قبل از اجرا، مسیر
folder_pathرا با مسیر واقعی روی سیستم خودتان عوض کنید. - اگر میترسید فایل جابهجا شود، اول
shutil.moveرا موقتاً کامنت کنید و فقطprintرا ببینید.
مثال ۲: گزارش روزانهٔ اندازهٔ یک پوشه (مانیتورینگ ساده)
گاهی میخواهید بدانید یک پوشه (مثلاً پوشهٔ لاگ، بکآپ یا پروژه) هر روز چقدر بزرگتر شده است.
میتوانیم یک اسکریپت بنویسیم که:
- اندازهٔ کل پوشه را حساب کند
- نتیجه را در یک فایل متنی لاگ کند
import os
from datetime import datetime
folder_path = r"C:\Users\YourName\Projects"
log_file = "folder_size_log.txt"
def get_folder_size(path):
total_size = 0
for root, dirs, files in os.walk(path):
for name in files:
file_path = os.path.join(root, name)
total_size += os.path.getsize(file_path)
return total_size
size_bytes = get_folder_size(folder_path)
size_mb = size_bytes / (1024 * 1024)
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_line = f"{now} - اندازه پوشه: {size_mb:.2f} MB\n"
with open(log_file, "a", encoding="utf-8") as f:
f.write(log_line)
print("گزارش ثبت شد:")
print(log_line)بعداً میتوانید این اسکریپت را با زمانبندی (کران، Task Scheduler و …) هر روز بهطور خودکار اجرا کنید.
مثال ۳: جستوجو و جایگزینی خودکار متن در چند فایل
فرض کنید چندین فایل متنی دارید و میخواهید یک عبارت را در همهٔ آنها عوض کنید.
مثلاً:
- «شرکت الف» را با «شرکت ب» جایگزین کنید.
- یا یک شماره تلفن قدیمی را با شمارهٔ جدید عوض کنید.
import os
folder_path = r"C:\Users\YourName\Texts"
old_text = "شرکت الف"
new_text = "شرکت ب"
for file_name in os.listdir(folder_path):
if not file_name.endswith(".txt"):
continue
file_path = os.path.join(folder_path, file_name)
# خواندن محتوا
with open(file_path, "r", encoding="utf-8") as f:
content = f.read()
# اگر عبارت قدیمی در فایل نبود، رد شو
if old_text not in content:
continue
# جایگزینی
new_content = content.replace(old_text, new_text)
# نوشتن نسخه جدید
with open(file_path, "w", encoding="utf-8") as f:
f.write(new_content)
print(f"متن در فایل {file_name} بهروزرسانی شد.")پیش از اجرای چنین اسکریپتی:
- حتماً از فایلها بکآپ بگیرید.
- میتوانید ابتدا فقط با یک فایل تست کنید.
مثال ۴: ساخت گزارش ساده از یک فایل CSV
در دنیای واقعی، خیلی چیزها در قالب CSV ذخیره میشوند (خروجی اکسل، گزارشها، لاگها و …).
در این مثال:
- یک فایل CSV داریم با ستونهای ساده مثل:
name,score - میخواهیم:
- میانگین نمره را حساب کنیم
- بیشترین و کمترین نمره را پیدا کنیم
- یک خروجی متنی خلاصه تولید کنیم
فرض کنید فایل scores.csv این شکلی است:
name,score
Ali,17
Sara,19
Reza,14
Mina,20کد:
import csv
csv_file = "scores.csv"
report_file = "scores_report.txt"
scores = []
with open(csv_file, "r", encoding="utf-8") as f:
reader = csv.DictReader(f)
for row in reader:
score = float(row["score"])
scores.append(score)
if not scores:
print("هیچ نمرهای پیدا نشد.")
else:
avg_score = sum(scores) / len(scores)
max_score = max(scores)
min_score = min(scores)
report = []
report.append(f"تعداد دانشآموزان: {len(scores)}")
report.append(f"میانگین نمره: {avg_score:.2f}")
report.append(f"بیشترین نمره: {max_score}")
report.append(f"کمترین نمره: {min_score}")
report_text = "\n".join(report)
with open(report_file, "w", encoding="utf-8") as f:
f.write(report_text)
print("گزارش تولید شد:")
print(report_text)بعداً میتوانید:
- گزارش را به صورت فایل CSV جدید، یا
- با استفاده از کتابخانههای علم داده (در فصل ۱۶) پیشرفتهتر کنید.
مثال ۵: تبدیل خودکار نام فایلها (Batch Rename)
خیلی وقتها نیاز دارید تعداد زیادی فایل را یکجا تغییر نام بدهید؛
مثلاً:
- عکسهایی مثل
IMG_001.jpg,IMG_002.jpgرا بهtrip_001.jpg،trip_002.jpgتبدیل کنید. - یا فاصلهها را با
_جایگزین کنید.
نمونه: اضافه کردن پیشوند به همهٔ فایلهای یک پوشه.
import os
folder_path = r"C:\Users\YourName\Photos"
prefix = "trip_"
for file_name in os.listdir(folder_path):
old_path = os.path.join(folder_path, file_name)
if os.path.isdir(old_path):
continue
new_name = prefix + file_name
new_path = os.path.join(folder_path, new_name)
print(f"{file_name} -> {new_name}")
os.rename(old_path, new_path)ایدههای تکمیلی:
- میتوانید شمارهگذاری خودکار اضافه کنید (
photo_001.jpg,photo_002.jpg, …). - میتوانید پسوند خاصی را هدف بگیرید (مثلاً فقط
.jpgها را تغییر نام دهید).
مثال ۶: یادآور سادهٔ کارها در خط فرمان
میخواهیم برنامهای بسازیم که:
- کارهایی که باید انجام دهید را در یک فایل ساده ذخیره کند.
- در هر اجرا، کارهای ثبتشده را نشان دهد.
- به شما اجازه دهد کار جدید اضافه کنید.
فایل داده را tasks.txt فرض میکنیم.
import os
TASKS_FILE = "tasks.txt"
def show_tasks():
if not os.path.exists(TASKS_FILE):
print("هیچ کاری ثبت نشده است.")
return
with open(TASKS_FILE, "r", encoding="utf-8") as f:
lines = f.readlines()
if not lines:
print("لیست کارها خالی است.")
return
print("لیست کارها:")
for i, line in enumerate(lines, start=1):
print(f"{i}. {line.strip()}")
def add_task(task):
with open(TASKS_FILE, "a", encoding="utf-8") as f:
f.write(task + "\n")
print("کار جدید اضافه شد.")
def main():
while True:
print("\n1) نمایش کارها")
print("2) افزودن کار جدید")
print("3) خروج")
choice = input("انتخاب شما: ").strip()
if choice == "1":
show_tasks()
elif choice == "2":
task = input("متن کار جدید را وارد کنید: ").strip()
if task:
add_task(task)
elif choice == "3":
print("خروج از برنامه.")
break
else:
print("گزینه نامعتبر.")
if __name__ == "__main__":
main()این برنامه خیلی ساده است، اما:
- نمونهای از برنامه تعاملی است.
- از فایل برای ذخیرهٔ داده استفاده میکند.
- ایدهٔ یک «مدیر کارهای خط فرمانی» را پیاده میکند که بعداً میتوانید آن را گسترش دهید.
مثال ۷: دانلود خودکار چند فایل از روی وب (سطح پایه)
برای کارهای واقعی خودکارسازی، گاهی لازم است چند فایل را از آدرسهای اینترنتی مشخص دانلود کنید؛
مثلاً:
- چند گزارش روزانه،
- چند تصویر نمونه،
- یا بکآپهای روی سرور.
در این مثال از ماژول requests استفاده میکنیم که باید با pip نصب شود (در فصل کتابخانهها دیدهاید):
# نصب:
# pip install requestsکد:
import os
import requests
download_folder = "downloads"
os.makedirs(download_folder, exist_ok=True)
urls = [
"https://example.com/file1.txt",
"https://example.com/file2.txt",
]
for url in urls:
file_name = url.split("/")[-1]
file_path = os.path.join(download_folder, file_name)
print(f"در حال دانلود {url} ...")
response = requests.get(url)
if response.status_code == 200:
with open(file_path, "wb") as f:
f.write(response.content)
print(f"ذخیره شد در {file_path}")
else:
print(f"دانلود ناموفق برای {url} (کد وضعیت: {response.status_code})")نکته:
- در دنیای واقعی باید خطاها، قطعی اینترنت و … را هم مدیریت کنید، اما برای شروع همین کافی است.
چگونه از این مثالها بیشترین استفاده را ببریم؟
برای اینکه این مثالها واقعاً به دردتان بخورند:
- هر مثال را برای مشکل واقعی خودتان شخصیسازی کنید.
- مسیر پوشهها، نام فایلها، متنها و … را تغییر دهید.
- اسکریپتها را قدمبهقدم بسازید.
- اول فقط چاپ (
print) کنید که چه کاری قرار است انجام شود. - بعد که مطمئن شدید، بخشهای حساس مثل
os.rename,shutil.move,writeرا فعال کنید. - چند مثال را با هم ترکیب کنید.
- مثلاً:
- دانلود چند فایل (مثال ۷) + مرتبسازی در پوشه (مثال ۱) + گزارش حجم (مثال ۲).
- ایدههای خودتان را بنویسید.
هر وقت کاری را بیش از یک یا دو بار تکراری انجام میدهید، از خود بپرسید:
$$ \text{"آیا میتوانم این را با پایتون خودکار کنم؟"} $$
در فصلهای بعدی (وب، علم داده، پروژهها) خواهید دید که همین ایدهٔ سادهٔ خودکارسازی، چطور میتواند تبدیل به ابزارها و برنامههای جدیتر شود.