textwrap — 文字換行和填充

原始碼: Lib/textwrap.py


textwrap 模組提供了一些方便的函式,以及 TextWrapper 類,該類執行所有工作。如果您只是要換行或填充一兩個文字字串,那麼使用這些便利函式就足夠了;否則,為了效率,您應該使用 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 的例項屬性相對應。請注意,空格會在文字傳遞給 TextWrapper fill() 函式之前摺疊,因此更改 tabsizeexpand_tabsdrop_whitespacereplace_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'
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)換行行的最大長度。只要輸入文字中沒有單個單詞的長度超過 widthTextWrapper 保證沒有輸出行會超過 width 個字元。

expand_tabs

(預設值:True)如果為 true,則 text 中的所有制表符將使用 textexpandtabs() 方法擴充套件為空格。

tabsize

(預設值:8)如果 expand_tabs 為 true,則 text 中的所有制表符將根據當前列和給定的製表符大小擴充套件為零個或多個空格。

在 3.3 版本中新增。

replace_whitespace

(預設值:True)如果為 true,則在製表符擴充套件之後但在換行之前,wrap() 方法會將每個空白字元替換為單個空格。替換的空白字元如下:製表符、換行符、垂直製表符、換頁符和回車符 ('\t\n\v\f\r')。

注意

如果 expand_tabs 為 false 並且 replace_whitespace 為 true,則每個製表符將替換為單個空格,這與製表符擴充套件相同。

注意

如果 replace_whitespace 為 false,則換行符可能會出現在行的中間並導致奇怪的輸出。因此,文字應拆分為段落(使用 str.splitlines() 或類似方法),這些段落將單獨換行。

drop_whitespace

(預設值:True)如果為 true,則每行開頭和結尾的空格(換行之後但在縮排之前)將被刪除。但是,如果段落的開頭後跟非空格,則段落開頭的空格不會被刪除。如果要刪除的空格佔據了整行,則將刪除整行。

initial_indent

(預設值:'')將新增到換行輸出的第一行的字串。計入第一行的長度。空字串不縮排。

subsequent_indent

(預設值:'')將新增到除第一行之外的所有換行輸出行的字串。計入除第一行之外的每一行的長度。

fix_sentence_endings

(預設值:False)如果為 true,則 TextWrapper 會嘗試檢測句子結尾,並確保句子之間始終恰好分隔兩個空格。這通常是單空格字型中所需的文字。但是,句子檢測演算法並不完善:它假設句子結尾由小寫字母后跟 '.''!''?' 之一組成,可能後跟 '"'"'" 之一,然後是一個空格。此演算法的一個問題是它無法檢測到以下內容中 “Dr.” 與

[...] Dr. Frankenstein's monster [...]

和以下內容中的 “Spot.” 之間的區別:

[...] See Spot. See Spot run [...]

fix_sentence_endings 預設為 false。

由於句子檢測演算法依賴於 string.lowercase 來定義“小寫字母”,並約定在句點後使用兩個空格來分隔同一行上的句子,因此它特定於英語文字。

break_long_words

(預設值:True)如果為 true,則長度大於 width 的單詞將被打斷,以確保沒有行的長度大於 width。如果為 false,則長單詞將不會被打斷,並且某些行的長度可能大於 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 中的單個段落換行,並返回包含換行段落的單個字串。