ویژگی تصویر

معرفی کلی: کتابخانه glob در پایتون چیست و چرا مفید است

  /  پایتون   /  کتابخانه glob در پایتون
بنر تبلیغاتی الف

کتابخانه glob یک ماژول استاندارد در پایتون است که برای پیدا کردن فایل‌ها و دایرکتوری‌ها براساس الگوهای wildcard (مثل *، ?، [ ] ) طراحی شده است. این ماژول بسیار ساده اما قدرتمند است و در اسکریپت‌های اتوماسیون، پردازش دسته‌ای فایل و کاربردهای مرتبط با فایل‌سیستم بسیار کاربرد دارد.

ویژگی‌های کلیدی

  • پشتیبانی از الگوهای عمومی (wildcard) مثل *، ? و مجموعه‌های کاراکتری [a-z]
  • امکان جستجوی بازگشتی با الگوی **
  • تابع glob.glob که لیستی از مسیرها برمی‌گرداند و glob.iglob که یک generator برمی‌گرداند
  • سازگاری با os.path و pathlib

قواعد الگوها (Pattern Matching)

  • * : صفر یا چند کاراکتر به‌جز جداکننده مسیر (slash)
  • ? : دقیقاً یک کاراکتر
  • [seq] : یکی از کاراکترهای داخل براکت
  • [!seq] یا [^seq] : کاراکتری که در لیست نیست (در برخی پیاده‌سازی‌ها)
  • ** : در حالت recursive برای تطابق چند سطح دایرکتوری

مثال پایه‌ای: لیست کردن فایل‌های پایتون در شاخه فعلی

import glob

py_files = glob.glob("*.py")
print(py_files)

این کد تمام فایل‌هایی که پسوند .py دارند را در دایرکتوری فعلی برمی‌گرداند و آنها را به صورت یک لیست نمایش می‌دهد. توجه داشته باشید که این تابع نتیجه را به‌صورت لیست کامل برمی‌گرداند، در نتیجه برای دایرکتوری‌های بسیار بزرگ ممکن است مصرف حافظه قابل توجهی داشته باشد.

استفاده از جستجوی بازگشتی

برای جستجوی بازگشتی باید پارامتر recursive=True را به glob.glob یا glob.iglob بدهید و از الگوی ** استفاده کنید.

import glob

all_py = glob.glob("**/*.py", recursive=True)
print(len(all_py))
for p in all_py[:5]:
    print(p)

در این مثال تمام فایل‌های .py در شاخه فعلی و زیرشاخه‌ها پیدا می‌شوند. این روش سریع و دم‌دستی است، اما مانند قبل، glob.glob تمام نتایج را در حافظه بارگذاری می‌کند.

بهینه‌سازی: استفاده از iglob برای مصرف حافظه کمتر

import glob

for filepath in glob.iglob("**/*.log", recursive=True):
    # پردازش خط به خط یا باز و خواندن به صورت جریان
    process_file(filepath)

glob.iglob بجای بازگرداندن لیست کامل، یک iterator تولید می‌کند. این برای پردازش دسته‌ای فایل‌ها یا اسکریپت‌هایی که قرار است فایل‌ها را یکی‌یکی بخوانند بسیار مناسب است و از مصرف زیاد حافظه جلوگیری می‌کند.

مثال‌های واقعی و کاربردی

  • تبدیل همه فایل‌های .md به HTML در یک پروژه مستندات
  • پاکسازی فایل‌های موقت (*.tmp, *.log) به صورت دسته‌ای
  • جمع‌آوری مسیر تمام تصاویر در یک دایرکتوری برای پردازش دسته‌ای

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

import glob
import os
from collections import defaultdict

groups = defaultdict(list)
for fp in glob.iglob("**/*.*", recursive=True):
    ext = os.path.splitext(fp)[1].lower()
    groups[ext].append(fp)

for ext, files in groups.items():
    print(ext, len(files))

در این اسکریپت با استفاده از glob.iglob تمام مسیرهایی که حاوی نقطه هستند پیدا شده و بر اساس پسوند دسته‌بندی می‌شوند. این نمونه نشان می‌دهد چگونه می‌توان خروجی glob را مستقیماً با os.path ترکیب کرد.

مقایسه با pathlib

ویژگیglobpathlib
قابلیت بازگشتیglob.glob(…, recursive=True) / iglobPath.rglob() یا Path.glob(“**/…”)
نوع خروجیرشته مسیرآبجکت Path
رابط مدرنانتزاع کمترروش شیءگرا و کاربردی‌تر

نمونه با pathlib: پیشنهاد مدرن

from pathlib import Path

p = Path(".")
for f in p.rglob("*.csv"):
    print(f.name, f.stat().st_size)

pathlib روش‌های قدرتمندی برای کار با مسیرها ارائه می‌دهد و خروجی آن آبجکت Path است که متدهای مفیدی مانند .read_text(), .stat() و .suffix دارد. برای کدهای جدید توصیه می‌شود از pathlib استفاده کنید.

نکات پیشرفته و خطاهای رایج

  • حساسیت به حروف (case sensitivity) ناشی از فایل‌سیستم است؛ در ویندوز معمولاً غیرفعال و در لینوکس فعال است.
  • برای ایمن‌سازی الگوهایی که ممکن است حاوی متاکاراکتر باشند از glob.escape استفاده کنید.
  • در ویندوز بهتر است از raw string (r”pattern”) یا استفاده از / به‌جای برای جلوگیری از اشتباهات escape استفاده شود.
  • پیروی از قابلیت‌های symbolic link: glob به‌صورت پیش‌فرض از لینک‌ها عبور می‌کند؛ مراقب لوپ‌های احتمالی باشید.

مثال: استفاده از glob.escape

import glob

filename = "file[1].txt"
pattern = glob.escape(filename)
print(glob.glob(pattern))

glob.escape کاراکترهای متاتک را فرار (escape) می‌کند تا نام‌هایی که به‌طور طبیعی شامل [] یا * هستند به‌عنوان الگو تفسیر نشوند.

توصیه‌های عملی و بهترین شیوه‌ها

  • برای اسکریپت‌های ساده و کاربردی glob بسیار مناسب است؛ برای پروژه‌های پیچیده‌تر از pathlib استفاده کنید.
  • اگر تعداد فایل‌ها زیاد است از iglob یا pathlib و پردازش جریان‌محور بهره بگیرید تا حافظه کمتر مصرف شود.
  • برای عملیات‌های موازی ابتدا مسیرها را با iglob پیداکرده و سپس با concurrent.futures یا multiprocessing پردازش را توزیع کنید.
  • برای کدهایی که باید در سیستم‌عامل‌های مختلف اجرا شوند، مراقب جداکننده مسیر و حساسیت به حروف باشید.

خلاصه و جمع‌بندی

ماژول glob ابزاری ساده، سریع و مناسب برای جستجو و جمع‌آوری مسیر فایل‌ها براساس الگوهاست. برای کارهای روزمره و اسکریپت‌های اتوماسیون عالی است؛ اما برای کدهای مدرن و شیءگرا pathlib گزینه بهتر و منعطف‌تری است. استفاده از iglob برای مقیاس‌پذیری و glob.escape برای جلوگیری از اشتباهات الگوها از نکات مهمی است که باید در عمل به کار ببرید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: