textwrap --- پیچیدن و پر کردن متن¶
کد منبع: Lib/textwrap.py
ماژول textwrap چند تابع سهولتبخش و همچنین TextWrapper، کلاسی که تمام کارها را انجام میدهد، فراهم میکند. اگر فقط در حال پیچیدن (wrapping) یا پر کردن (filling) یک یا دو رشته متنی هستید، توابع سهولتبخش باید کافی باشند؛ در غیر این صورت، برای کارایی باید از نمونهای از TextWrapper استفاده کنید.
- textwrap.wrap(text, width=70, *, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')¶
پاراگراف واحد در text (یک رشته) را میشکند تا طول هر سطر حداکثر width نویسه باشد. فهرستی از سطرهای خروجی را بدون نویسههای سطر جدید پایانی برمیگرداند.
آرگومانهای کلیدواژهای اختیاری متناظر با ویژگیهای نمونهی
TextWrapperهستند که در زیر مستند شدهاند.برای جزئیات بیشتر درباره چگونگی رفتار
wrap()، متدTextWrapper.wrap()را ببینید.
- textwrap.fill(text, width=70, *, initial_indent='', subsequent_indent='', expand_tabs=True, replace_whitespace=True, fix_sentence_endings=False, break_long_words=True, drop_whitespace=True, break_on_hyphens=True, tabsize=8, max_lines=None, placeholder=' [...]')¶
بند واحد موجود در text را سطربندی میکند و یک رشته واحد شامل بند سطربندیشده را برمیگرداند.
fill()میانبری برای"\n".join(wrap(text, ...))
بهویژه،
fill()دقیقاً همان آرگومانهای کلیدواژهایwrap()را میپذیرد.
- textwrap.shorten(text, width, *, fix_sentence_endings=False, break_long_words=True, break_on_hyphens=True, placeholder=' [...]')¶
متن text دادهشده را فشرده و کوتاه کنید تا در عرض width دادهشده جای گیرد.
ابتدا فضای سفید در text فشرده میشود (تمام فضای سفید با فاصلههای تکی جایگزین میشود). اگر نتیجه در width بگنجد، برگردانده میشود. در غیر این صورت، تعداد کافی از واژهها از انتها حذف میشوند تا واژههای باقیمانده بههمراه placeholder در width بگنجند:
>>> textwrap.shorten("Hello world!", width=12) 'Hello world!' >>> textwrap.shorten("Hello world!", width=11) 'Hello [...]' >>> textwrap.shorten("Hello world", width=10, placeholder="...") 'Hello...'
آرگومانهای کلیدواژهای اختیاری متناظر با ویژگیهای نمونهی
TextWrapperهستند که در ادامه مستند شدهاند. توجه داشته باشید که فضاهای خالی پیش از آنکه متن به تابعfill()کلاسTextWrapperارسال شود، فشرده میشوند؛ بنابراین تغییر مقدارtabsize،expand_tabs،drop_whitespaceوreplace_whitespaceاثری نخواهد داشت.اضافه شده در نسخهی 3.4.
- textwrap.dedent(text)¶
هرگونه فضای سفید مشترک را از ابتدای هر سطر در text حذف میکند.
میتوان از این قابلیت برای همتراز کردن رشتههای سهنقلقولی با لبهی چپ نمایش استفاده کرد، در حالی که همچنان در کد منبع بهصورت فرورفته ارائه میشوند.
توجه داشته باشید که تبها و فاصلهها هر دو بهعنوان فضای سفید در نظر گرفته میشوند، اما برابر نیستند: سطرهای
" hello"و"\thello"بهعنوان سطرهایی در نظر گرفته میشوند که هیچ فضای سفید پیشرو مشترکی ندارند.سطرهایی که فقط شامل فضای سفید هستند، در ورودی نادیده گرفته میشوند و در خروجی به یک نویسه خط جدید نرمالسازی میشوند.
برای مثال:
def test(): # end first line with \ to avoid the empty line! s = '''\ hello world ''' print(repr(s)) # prints ' hello\n world\n ' print(repr(dedent(s))) # prints 'hello\n world\n'
تغییر یافته در نسخهی 3.14: تابع
dedent()اکنون سطرهای خالی را که فقط حاوی نویسههای فضای خالی هستند، بهدرستی عادیسازی میکند. پیشتر، پیادهسازی فقط سطرهای خالی حاوی تبها و فاصلهها را عادیسازی میکرد.
- textwrap.indent(text, prefix, predicate=None)¶
prefix را به ابتدای سطرهای انتخابشده در text اضافه کنید.
سطرها با فراخوانی
text.splitlines(True)جدا میشوند.بهطور پیشفرض، prefix به تمام سطرهایی که فقط از فضای خالی (از جمله هرگونه پایان خط) تشکیل نشدهاند، اضافه میشود.
برای مثال:
>>> s = 'hello\n\n \nworld' >>> indent(s, ' ') ' hello\n\n \n world'
آرگومان اختیاری predicate میتواند برای کنترل اینکه کدام سطرهای تورفتگی داده شوند استفاده شود. برای مثال، افزودن prefix حتی به سطرهای خالی و سطرهای فقط دارای فضای سفید آسان است:
>>> print(indent(s, '+ ', lambda line: True)) + hello + + + world
اضافه شده در نسخهی 3.3.
wrap()، fill() و shorten() با ایجاد یک نمونه TextWrapper و فراخوانی یک متد واحد بر روی آن کار میکنند. این نمونه دوباره استفاده نمیشود، بنابراین برای برنامههایی که رشتههای متنی بسیاری را با استفاده از wrap() و/یا fill() پردازش میکنند، ممکن است کارآمدتر باشد که شیء TextWrapper خود را ایجاد کنید.
متن ترجیحاً در فضاهای خالی و درست پس از خطتیرهها در کلمات خطتیرهدار شکسته میشود؛ تنها در این صورت است که کلمات طولانی در صورت لزوم شکسته خواهند شد، مگر اینکه TextWrapper.break_long_words روی false تنظیم شده باشد.
- class textwrap.TextWrapper(**kwargs)¶
سازندهی
TextWrapperتعدادی آرگومان کلیدواژهای اختیاری میپذیرد. هر آرگومان کلیدواژهای با یک ویژگی نمونه متناظر است، بنابراین برای مثالwrapper = TextWrapper(initial_indent="* ")
معادل است با
wrapper = TextWrapper() wrapper.initial_indent = "* "
شما میتوانید بارها از همان شیء
TextWrapperاستفاده مجدد کنید و میتوانید هر یک از گزینههای آن را بین استفادهها از طریق انتساب مستقیم به ویژگیهای نمونه تغییر دهید.ویژگیهای نمونهی
TextWrapper(و آرگومانهای کلیدواژهای سازنده) به شرح زیر است:- width¶
(پیشفرض:
70) حداکثر طول سطرهای شکستهشده. تا زمانی که در متن ورودی هیچ کلمهی منفردی طولانیتر ازwidthوجود نداشته باشد،TextWrapperتضمین میکند که هیچ سطر خروجیای طولانیتر ازwidthنویسه نخواهد بود.
- expand_tabs¶
(پیشفرض:
True) اگر درست باشد، همهی نویسههای تب در text با استفاده از متدexpandtabs()از text به فاصله تبدیل میشوند.
- tabsize¶
(پیشفرض:
8) اگرexpand_tabsدرست باشد، تمام نویسههای Tab در text بسته به ستون جاری و اندازهی Tab دادهشده، به صفر یا چند فاصله تبدیل میشوند.اضافه شده در نسخهی 3.3.
- replace_whitespace¶
(پیشفرض:
True) اگر True باشد، پس از بسط تب اما پیش از پوشش دادن، متدwrap()هر نویسه فضای خالی را با یک فاصله جایگزین میکند. نویسههای فضای خالی که جایگزین میشوند عبارتاند از: تب، خط جدید، تب عمودی، تغذیهی صفحه و بازگشت به ابتدای سطر ('\t\n\v\f\r').توجه
اگر
expand_tabsنادرست وreplace_whitespaceدرست باشد، هر نویسهی تب با یک فاصله جایگزین میشود، که این با گسترش تب یکسان نیست.توجه
اگر
replace_whitespaceنادرست باشد، ممکن است نویسههای خط جدید در میانهی یک خط ظاهر شوند و باعث ایجاد خروجی عجیبی شوند. به همین دلیل، متن باید به پاراگرافها تقسیم شود (با استفاده ازstr.splitlines()یا مشابه آن) که هرکدام بهصورت جداگانه پیچیده شوند.
- drop_whitespace¶
(پیشفرض:
True) اگر درست باشد، فضای سفید در ابتدا و انتهای هر سطر (پس از سطربندی اما پیش از تورفتگی) حذف میشود. با این حال، فضای سفید در ابتدای پاراگراف حذف نمیشود، اگر به دنبال آن نویسهای غیر از فضای سفید بیاید. اگر فضای سفیدی که حذف میشود یک خط کامل را تشکیل دهد، کل خط حذف میشود.
- initial_indent¶
(پیشفرض:
'') رشتهای که به ابتدای اولین خط از خروجی شکستهشده اضافه میشود. در طول اولین خط لحاظ میشود. رشته خالی تورفتگی ایجاد نمیکند.
- subsequent_indent¶
(پیشفرض:
'') رشتهای که به ابتدای تمام سطرهای خروجی خطپیچیشده بهجز خط اول اضافه میشود. جزء طول هر خط بهجز خط اول محسوب میشود.
- fix_sentence_endings¶
(پیشفرض:
False) اگر درست باشد،TextWrapperتلاش میکند پایان جملات را تشخیص دهد و تضمین کند که جملات همیشه با دقیقاً دو فاصله از هم جدا شوند. این حالت معمولاً برای متن با قلم تکفاصله مطلوب است. با این حال، الگوریتم تشخیص جمله کامل نیست: فرض میکند که پایان یک جمله از یک حرف کوچک تشکیل شده است که پس از آن یکی از'.'،'!'یا'?'میآید، ممکن است پس از آن یکی از'"'یا"'"و سپس یک فاصله بیاید. یکی از مشکلات این الگوریتم ناتوانی آن در تشخیص تفاوت بین «Dr.» در[...] Dr. Frankenstein's monster [...]
و "Spot." در
[...] See Spot. See Spot run [...]
fix_sentence_endingsبهطور پیشفرض نادرست است.از آنجا که الگوریتم تشخیص جمله برای تعریف «نویسه کوچک» به
string.lowercaseو به قرارداد استفاده از دو فاصله پس از نقطه برای جدا کردن جملهها در یک خط متکی است، این الگوریتم مختص متنهای انگلیسیزبان است.
- break_long_words¶
(پیشفرض:
True) اگر مقدار درست باشد، واژههای طولانیتر ازwidthشکسته خواهند شد تا اطمینان حاصل شود که هیچ سطری طولانیتر ازwidthنباشد. اگر مقدار نادرست باشد، واژههای طولانی شکسته نخواهند شد و برخی سطرها ممکن است طولانیتر ازwidthباشند. (واژههای طولانی در سطری جداگانه قرار خواهند گرفت تا میزان فراتر رفتن ازwidthبه حداقل برسد.)
- break_on_hyphens¶
(پیشفرض:
True) اگر True باشد، شکستن سطرهای ترجیحاً در فضاهای خالی و بلافاصله پس از خطتیرهها در کلمات مرکب انجام میشود، همانگونه که در انگلیسی مرسوم است. اگر False باشد، فقط فضاهای خالی بهعنوان مکانهای مناسب بالقوه برای شکست خط در نظر گرفته میشوند، اما اگر کلماتی واقعاً غیرقابل شکستن میخواهید، بایدbreak_long_wordsرا روی False تنظیم کنید. رفتار پیشفرض در نسخههای پیشین این بود که همیشه اجازه شکستن کلمات خطتیرهدار داده شود.
- max_lines¶
(پیشفرض:
None) اگرNoneنباشد، خروجی شامل حداکثر max_lines خط خواهد بود و placeholder در انتهای خروجی ظاهر میشود.اضافه شده در نسخهی 3.4.
- placeholder¶
(پیشفرض:
' [...]') رشتهای که اگر متن خروجی بریده شده باشد، در انتهای آن ظاهر میشود.اضافه شده در نسخهی 3.4.
TextWrapperهمچنین برخی متدهای عمومی را نیز ارائه میدهد، مشابه توابع کمکی سطح ماژول:- wrap(text)¶
بند واحد موجود در text (یک رشته) را میپیچد تا طول هر خط حداکثر
widthنویسه باشد. تمام گزینههای پیچیدن از ویژگیهای نمونهیTextWrapperگرفته میشوند. فهرستی از سطرهای خروجی را برمیگرداند، بدون نویسههای خط جدید پایانی. اگر خروجی حاصل از پیچیدن محتوایی نداشته باشد، فهرست برگرداندهشده خالی است.
- fill(text)¶
پاراگراف واحد موجود در text را میپیچد و یک رشته واحد شامل پاراگراف پیچیدهشده را برمیگرداند.