خانه / آموزش‌ها / آموزش جامع ماژول textwrap در پایتون

آموزش جامع ماژول textwrap در پایتون

🐍 HomeOfPython
|
📅 1404/10/18

ماژول textwrap یکی از کتابخانه‌های استاندارد و بسیار کاربردی پایتون است که برای قالب‌بندی متون، شکستن خطوط طولانی به پاراگراف‌های منظم، و مدیریت تورفتگی‌ها (Indentation) استفاده می‌شود. این ابزار به ویژه در ساخت ابزارهای خط فرمان (CLI)، تولید گزارش‌های متنی و تمیز کردن ورودی‌های کاربر کاربرد دارد.

سطح مقدماتی (Beginner Level)

در این سطح با توابع اصلی ماژول textwrap آشنا می‌شویم که برای کارهای روزمره و ساده طراحی شده‌اند. هدف اصلی در اینجا یادگیری نحوه نمایش مرتب متن‌ها در عرض (Width) مشخص است.

۱. شکستن متن با wrap و fill

دو تابع اصلی این ماژول wrap() و fill() هستند.

  • wrap(text, width): متن را به قطعاتی با طول مشخص می‌شکند و یک لیست از رشته‌ها برمی‌گرداند.
  • fill(text, width): دقیقاً همان کار را می‌کند، اما خروجی را به صورت یک رشته واحد که با \n جدا شده است برمی‌گرداند.

مثال ۱: استفاده از wrap (خروجی لیست)

در این مثال می‌بینیم که چگونه یک متن طولانی به لیستی از خطوط کوتاه‌تر تبدیل می‌شود.

Python

مثال ۲: استفاده از fill (خروجی متنی)

معمولاً برای چاپ در ترمینال از fill استفاده می‌کنیم چون مستقیماً قابل چاپ است.

Python

مثال ۳: ساختار کلی (بدون اجرا)

اگر بخواهیم فقط منطق را نشان دهیم، ساختار به این صورت است:

python
import textwrap

def format_for_ui(text):
    # این تابع فقط یک تکه کد است و فراخوانی نمی‌شود
    return textwrap.fill(text, width=50)

۲. حذف تورفتگی‌های زائد با dedent

وقتی در پایتون یک متن چندخطی (Triple-quoted string) را داخل یک تابع یا کلاس می‌نویسید، فاصله‌های سمت راست کد (Indentation) نیز جزوی از رشته می‌شوند. تابع dedent() این فاصله‌های مشترک اولیه را حذف می‌کند تا متن به سمت راست بچسبد.

مثال ۱: مشکل تورفتگی (بدون اجرا)

در کد زیر، متن دارای فاصله‌هایی است که شاید نخواهیم در خروجی نهایی باشند:

python
def get_sql_query():
    # این فاصله سمت راست در رشته نهایی وجود خواهد داشت
    query = """
        SELECT *
        FROM users
        WHERE active = 1
    """
    return query

مثال ۲: حل مشکل با dedent (اجرایی)

این کد نشان می‌دهد چگونه dedent فضا‌های خالی سمت چپ را پاکسازی می‌کند.

Python

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، ما نیاز به کنترل دقیق‌تری روی نحوه شکستن خطوط، مدیریت کلمات خیلی طولانی، و اضافه کردن پیشوندها (Prefix) به پاراگراف‌ها داریم. همچنین با کلاس TextWrapper برای بهینه‌سازی پرفورمنس کار خواهیم کرد.

۱. مدیریت پیشوندها با indent

تابع indent() به ابتدای تمام خطوط یک متن، یک رشته خاص (مثل > یا \t) اضافه می‌کند. این قابلیت برای نقل‌قول کردن (Quoting) در ایمیل‌ها یا لاگ‌ها بسیار مفید است.

مثال ۱: نقل‌قول کردن یک پیام

Python

مثال ۲: استفاده از predicate برای فیلتر خطوط

شما می‌توانید با آرگومان predicate تعیین کنید کدام خطوط تورفتگی بگیرند.

Python

۲. خلاصه‌سازی متن با shorten

تابع shorten() برای کوتاه کردن متن به یک اندازه مشخص و اضافه کردن [...] (placeholder) در انتهای آن استفاده می‌شود. این تابع هوشمند است و کلمات را نصفه نمی‌برد، مگر اینکه مجبور شود.

مثال ۱: ساخت پیش‌نمایش خبر

Python

۳. کلاس TextWrapper (برای کارایی بالا)

اگر قرار است یک تنظیم خاص را روی صدها رشته مختلف اعمال کنید، استفاده مداوم از توابع wrap یا fill بهینه نیست، زیرا هر بار یک شیء جدید می‌سازند. در عوض، یک نمونه از کلاس TextWrapper بسازید و بارها از آن استفاده کنید.

ویژگی‌های مهم TextWrapper:

  • initial_indent: تورفتگی فقط برای خط اول.
  • subsequent_indent: تورفتگی برای تمام خطوط به جز خط اول.
  • fix_sentence_endings: تلاش برای اصلاح فاصله‌گذاری پایان جملات (بیشتر برای انگلیسی).

مثال ۱: تنظیمات پیشرفته پاراگراف

Python

مثال ۲: مدیریت کلمات طولانی

به صورت پیش‌فرض، اگر کلمه‌ای از width بزرگتر باشد، textwrap آن را می‌شکند. با break_long_words=False می‌توان از این کار جلوگیری کرد (گرچه ممکن است از کادر بیرون بزند).

Python

۴. نکات فنی و Edge Caseها

هنگام کار با متون فارسی و ترکیب آن با انگلیسی، ممکن است جهت متن (RTL/LTR) در ترمینال بهم بریزد. textwrap ذاتا بر اساس تعداد کاراکتر کار می‌کند و نه پیکسل نمایشی.

python
# نکته فنی (Static Code)
# textwrap با کاراکترهای یونیکد عریض (Wide characters) مثل ایموجی‌ها
# گاهی اوقات در محاسبه عرض دچار خطا می‌شود.
import textwrap

def handle_unicode_text(text):
    # برای زبان‌های آسیایی یا دارای ایموجی،
    # ممکن است نیاز به کتابخانه‌های جانبی مثل wcwidth باشد
    pass
Python