Table of Contents
مقدمهٔ کار با فایلها و پوشهها در خودکارسازی
در خودکارسازی، یکی از مهمترین کارها این است که بتوانیم فایلها را جابهجا کنیم، پوشه بسازیم، فایلهای قدیمی را پاک کنیم، از روی فایلها گزارش بگیریم و… . این کارها را به جای انجام دستی، میتوانیم با چند خط کد پایتون انجام دهیم.
در این بخش، روی این موارد تمرکز میکنیم:
- کار با مسیرها (paths)
- بررسی وجود فایل یا پوشه
- ساختن پوشه
- خواندن محتویات یک پوشه
- تغییر نام و حذف فایل / پوشه
- کپی و جابهجا کردن فایلها
- چند مثال سادهٔ خودکارسازی روی فایلها
از توضیح جزییات «خودکارسازی چیست» و «فایل چیست» صرفنظر میکنیم چون در بخشهای دیگر آمدهاند.
کار با مسیر فایلها و پوشهها با `os` و `pathlib`
برای کار خودکار با فایلها و پوشهها معمولاً از دو ماژول استاندارد استفاده میشود:
- ماژول
osوos.path - ماژول
pathlib(نسبتاً مدرنتر و خواناتر)
در این فصل هر دو را میبینید، اما میتوانید یکی را بیشتر استفاده کنید.
بهدست آوردن پوشهٔ فعلی
پوشهٔ فعلی (current working directory) همان جایی است که برنامهٔ شما از دید سیستم در آن قرار دارد.
import os
current = os.getcwd()
print("پوشه فعلی:", current)
با pathlib:
from pathlib import Path
current = Path.cwd()
print("پوشه فعلی:", current)تغییر پوشهٔ فعلی
اگر بخواهید کارتان را در یک پوشهٔ دیگر انجام دهید:
import os
os.chdir("C:/Users/YourName/Documents") # در ویندوز
print(os.getcwd())در لینوکس / macOS مثلاً:
os.chdir("/home/user/projects")سعی کنید از مسیرهای درست برای سیستم عامل خودتان استفاده کنید.
ساختن و بررسی مسیرها
ترکیب بخشهای مسیر
به جای اینکه مسیرها را به صورت رشتههای ساده به هم بچسبانیم، بهتر است از توابع مخصوص استفاده کنیم تا روی همهٔ سیستمعاملها درست کار کنند.
با os.path.join:
import os
base = "C:/Users/YourName"
folder = "projects"
file_name = "report.txt"
path = os.path.join(base, folder, file_name)
print(path)
با pathlib (پیشنهادیتر):
from pathlib import Path
base = Path("C:/Users/YourName")
path = base / "projects" / "report.txt"
print(path)
استفاده از / با Path مخصوص همین کار است و با رشتهٔ معمولی فرق میکند.
جدا کردن بخشهای مسیر
با os.path:
- نام فایل:
os.path.basename(path) - پوشهٔ والد:
os.path.dirname(path) - پسوند فایل:
os.path.splitext(path)
import os
path = "C:/Users/YourName/projects/report.txt"
print(os.path.basename(path)) # report.txt
print(os.path.dirname(path)) # C:/Users/YourName/projects
name, ext = os.path.splitext(path)
print(name, ext) # report .txt
با pathlib:
from pathlib import Path
p = Path("C:/Users/YourName/projects/report.txt")
print(p.name) # report.txt
print(p.parent) # C:/Users/YourName/projects
print(p.stem) # report
print(p.suffix) # .txtبررسی وجود فایلها و پوشهها
قبل از انجام عملیات، معمولاً لازم است مطمئن شویم فایل یا پوشه وجود دارد.
با os.path:
import os
path = "data/input.txt"
if os.path.exists(path):
print("فایل یا پوشه وجود دارد")
else:
print("پیدا نشد")
با pathlib:
from pathlib import Path
p = Path("data/input.txt")
print(p.exists()) # True یا False
print(p.is_file()) # فقط اگر فایل باشد True
print(p.is_dir()) # فقط اگر پوشه باشد Trueساختن پوشهها (directories)
ساخت پوشهٔ ساده
import os
os.mkdir("logs") # پوشه logs را در پوشه فعلی میسازداگر پوشه از قبل وجود داشته باشد، خطا میگیرید. میتوانید قبلش چک کنید:
if not os.path.exists("logs"):
os.mkdir("logs")
با pathlib:
from pathlib import Path
p = Path("logs")
p.mkdir(exist_ok=True) # اگر باشد، خطا نمیدهدساخت پوشههای تو در تو
مثلاً reports/2025/jan که چند سطح دارد:
import os
os.makedirs("reports/2025/jan", exist_ok=True)
با pathlib:
from pathlib import Path
Path("reports/2025/jan").mkdir(parents=True, exist_ok=True)parents=Trueیعنی اگر پوشههای میانی وجود نداشتند، بساز.exist_ok=Trueیعنی اگر راه قبلاً وجود داشت، خطا نده.
لیست کردن محتویات پوشه
استفاده از `os.listdir`
import os
for item in os.listdir("."): # . یعنی پوشهٔ فعلی
print(item)این کار نام همهٔ فایلها و پوشهها را میدهد.
برای تشخیص فایل یا پوشه بودن:
import os
for item in os.listdir("."):
full_path = os.path.join(".", item)
if os.path.isfile(full_path):
print("فایل:", item)
elif os.path.isdir(full_path):
print("پوشه:", item)استفاده از `pathlib.iterdir`
from pathlib import Path
for p in Path(".").iterdir():
if p.is_file():
print("فایل:", p.name)
elif p.is_dir():
print("پوشه:", p.name)یافتن فایلها با الگو (`glob`)
اگر فقط بعضی فایلها مهماند (مثلاً فقط .txtها):
با glob در pathlib:
from pathlib import Path
for p in Path("reports").glob("*.txt"):
print(p)الگوی رایج:
*.txtهمهٔ فایلهای متنی/.txtهمهٔ.txtها در این پوشه و زیرپوشهها (glob("/.txt", recursive=True)درglobقدیمی)
تغییر نام و حذف فایلها و پوشهها
تغییر نام (rename / move ساده)
import os
os.rename("old_name.txt", "new_name.txt")اگر نام جدید مسیر دیگری باشد، عملاً فایل جابهجا میشود:
os.rename("old_name.txt", "archive/old_name.txt")
با pathlib:
from pathlib import Path
p = Path("old_name.txt")
p.rename("new_name.txt")حذف فایل
import os
if os.path.exists("temp.log"):
os.remove("temp.log")
با pathlib:
from pathlib import Path
p = Path("temp.log")
if p.exists():
p.unlink()حذف پوشهٔ خالی
import os
os.rmdir("empty_folder")
با pathlib:
from pathlib import Path
Path("empty_folder").rmdir()
اگر پوشه خالی نباشد، اینها خطا میدهند. برای حذف پوشهٔ پر، از shutil.rmtree استفاده میشود.
کپی و جابهجا کردن فایلها با `shutil`
ماژول shutil برای عملیات سطح بالاتر روی فایلها و پوشهها مناسب است.
کپی کردن فایل
import shutil
shutil.copy("data/input.txt", "backup/input_backup.txt")- اگر مسیر مقصد پوشه باشد، نام فایل قبلی حفظ میشود:
shutil.copy("data/input.txt", "backup")جابهجا کردن (move)
import shutil
shutil.move("data/input.txt", "processed/input.txt")
اگر پوشهٔ processed وجود نداشته باشد، معمولاً خطا میدهد؛ پس قبلش بسازید.
حذف پوشهٔ پر
import shutil
shutil.rmtree("old_reports") # کل پوشه و محتویاتش حذف میشوددر خودکارسازی واقعی، معمولاً قبل از چنین کاری، چند بار مطمئن میشویم که مسیر درست است، چون برگشتپذیر نیست.
دسترسی به اطلاعات فایل (اندازه، زمانها)
برای گزارشگرفتن یا مرتبسازی فایلها، ممکن است به اطلاعاتی مثل اندازه و زمان آخرین تغییر نیاز داشته باشید.
import os
from datetime import datetime
path = "data/input.txt"
info = os.stat(path)
size = info.st_size # بر حسب بایت
modified = datetime.fromtimestamp(info.st_mtime)
print("حجم (بایت):", size)
print("آخرین تغییر:", modified)با این دادهها میتوانید مثلاً فایلهای بزرگتر از یک حد را پیدا کنید یا فایلهایی که قدیمیاند را حذف/آرشیو کنید.
چند مثال کاربردی خودکارسازی روی فایلها
مثال ۱: مرتبسازی فایلها بر اساس پسوند
فرض کنید پوشهای دارید که همهچیز در آن ریخته و میخواهید خودکار آنها را در پوشههای جدا قرار دهید، مثلاً:
- همهٔ
.jpgها درimages/ - همهٔ
.txtها درtexts/ - بقیه در
others/
from pathlib import Path
import shutil
base = Path("messy_folder")
images = base / "images"
texts = base / "texts"
others = base / "others"
for folder in [images, texts, others]:
folder.mkdir(exist_ok=True)
for p in base.iterdir():
if p.is_dir():
continue # پوشهها را جابهجا نکن
if p.suffix.lower() in [".jpg", ".jpeg", ".png"]:
target = images / p.name
elif p.suffix.lower() in [".txt", ".md"]:
target = texts / p.name
else:
target = others / p.name
shutil.move(str(p), str(target))ایده:
- با
iterdirروی همهٔ آیتمها میچرخیم. - با
suffixپسوند را چک میکنیم. - با
shutil.moveجابهجا میکنیم.
مثال ۲: حذف خودکار فایلهای موقت قدیمی
مثلاً میخواهیم همهٔ فایلهای .log قدیمیتر از ۷ روز را حذف کنیم.
from pathlib import Path
import time
logs_dir = Path("logs")
now = time.time()
days = 7
limit_seconds = days * 24 * 60 * 60
for p in logs_dir.glob("*.log"):
age = now - p.stat().st_mtime
if age > limit_seconds:
print("حذف:", p)
p.unlink()این نمونه یک کار مهم خودکارسازی را نشان میدهد: نگهداشتن پوشهها تمیز و کنترل حجم دیسک.
مثال ۳: ساخت نسخهٔ پشتیبان ساده (Backup) از یک پوشه
یک پوشهٔ data داریم و میخواهیم یک کپی کامل در پوشهٔ backup/data_backup بسازیم:
from pathlib import Path
import shutil
source = Path("data")
backup_root = Path("backup")
backup_root.mkdir(exist_ok=True)
backup_path = backup_root / "data_backup"
if backup_path.exists():
shutil.rmtree(backup_path) # قبلی را پاک میکنیم
shutil.copytree(source, backup_path)
print("پشتیبانگیری انجام شد.")
copytree کل ساختار پوشه و فایلها را کپی میکند و برای بکاپ ساده بسیار مفید است.
نکات عملی برای کار ایمن با فایلها در خودکارسازی
- همیشه مسیرها را دو بار چک کنید، مخصوصاً هنگام حذف (
remove,rmtree). - قبل از حذف، اگر مهم است، یک نسخهٔ پشتیبان بسازید.
- برای مسیرهای پیچیده، از
Pathو عملگر/استفاده کنید تا کد خواناتر شود. - در اسکریپتهای واقعی، بهتر است از
try/exceptاستفاده کنید تا با خطاهای احتمالی (مثل عدم دسترسی، نبودن فایل و …) به خوبی برخورد شود. - سعی کنید مسیرها را «نسبی» به محل اسکریپت نگه دارید، مگر اینکه لازم باشد از مسیرهای کاملاً «مطلق» سیستم استفاده کنید.
با تسلط به این ابزارها، میتوانید بخش بزرگی از کارهای تکراری روزمرهٔ خود را با پایتون خودکار کنید: مرتبسازی دانلودها، آرشیو گزارشها، پاکسازی فایلهای موقت و ساخت نسخههای پشتیبان.