Kahibaro
Discord Login Register

کار با فایل‌ها و پوشه‌ها

مقدمهٔ کار با فایل‌ها و پوشه‌ها در خودکارسازی

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

در این بخش، روی این موارد تمرکز می‌کنیم:

از توضیح جزییات «خودکارسازی چیست» و «فایل چیست» صرف‌نظر می‌کنیم چون در بخش‌های دیگر آمده‌اند.


کار با مسیر فایل‌ها و پوشه‌ها با `os` و `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:

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)

لیست کردن محتویات پوشه

استفاده از `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)

الگوی رایج:

تغییر نام و حذف فایل‌ها و پوشه‌ها

تغییر نام (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)

با این داده‌ها می‌توانید مثلاً فایل‌های بزرگ‌تر از یک حد را پیدا کنید یا فایل‌هایی که قدیمی‌اند را حذف/آرشیو کنید.


چند مثال کاربردی خودکارسازی روی فایل‌ها

مثال ۱: مرتب‌سازی فایل‌ها بر اساس پسوند

فرض کنید پوشه‌ای دارید که همه‌چیز در آن ریخته و می‌خواهید خودکار آن‌ها را در پوشه‌های جدا قرار دهید، مثلاً:

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))

ایده:

مثال ۲: حذف خودکار فایل‌های موقت قدیمی

مثلاً می‌خواهیم همهٔ فایل‌های .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 کل ساختار پوشه و فایل‌ها را کپی می‌کند و برای بکاپ ساده بسیار مفید است.


نکات عملی برای کار ایمن با فایل‌ها در خودکارسازی

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

Views: 6

Comments

Please login to add a comment.

Don't have an account? Register now!