python:textwrap --文本自動換行與填充


textwrap 模塊提供了一些快捷函數,以及可以完成所有工作的類 TextWrapper。 如果你只是要對一兩個文本字符串進行自動換行或填充,快捷函數應該就夠用了;否則的話,你應該使用 TextWrapper 的實例來提高效率。

語法簡介

textwrap模塊提供的快捷函數如下:

wrap函數:

  • 對 text (字符串) 中的單獨段落自動換行以使每行長度最多為 width 個字符。 返回由輸出行組成的列表,行尾不帶換行符。
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)

fill函數:

  • 對 text 中的單獨段落自動換行,並返回一個包含被自動換行段落的單獨字符串。
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)

shorten函數:

  • 折疊並截短給定的 text 以符合給定的 width。
textwrap.shorten(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)

dedent函數:

  • 移除 text 中每一行的任何相同前綴空白符。
textwrap.shorten(text)

indent函數:

  • 將 prefix 添加到 text 中選定行的開頭。
  • 通過調用 text.splitlines(True) 來對行進行拆分。
  • 默認情況下,prefix 會被添加到所有不是只由空白符(包括任何行結束符)組成的行。
textwrap.indent(text, prefix, predicate=None)

參數說明:

  • width:(默認: 70) 自動換行的最大行長度。

  • expand_tabs:(默認: True) 如果為真值,則 text 中所有的制表符將使用 text 的 expandtabs() 方法擴展為空格符。

  • tabsize:(默認: 8) 如果 expand_tabs 為真值,則 text 中所有的制表符將擴展為零個或多個空格,具體取決於當前列位置和給定的制表寬度。

  • replace_whitespace:(默認: True) 如果為真值,在制表符擴展之后、自動換行之前,wrap() 方法將把每個空白字符都替換為單個空格。 會被替換的空白字符如下:制表,換行,垂直制表和回車 ('\t\n\v\r')。

  • drop_whitespace:(默認: True) 如果為真值,每一行開頭和末尾的空白字符(在包裝之后、縮進之前)會被丟棄。 但是段落開頭的空白字符如果后面不帶任何非空白字符則不會被丟棄。 如果被丟棄的空白字符占據了一個整行,則該整行將被丟棄。

  • initial_indent:(默認: ' ') 將被添加到被自動換行輸出內容的第一行的字符串。 其長度會被計入第一行的長度。 空字符串不會被縮進。

  • subsequent_indent:(默認: ' ') 將被添加到被自動換行輸出內容除第一行外的所有行的字符串。 其長度會被計入除行一行外的所有行的長度。

  • fix_sentence_endings:(默認: False) 如果為真值,TextWrapper 將嘗試檢測句子結尾並確保句子間總是以恰好兩個空格符分隔。 對於使用等寬字體的文本來說通常都需要這樣。

  • break_long_words:(默認: True) 如果為真值,則長度超過 width 的單詞將被分開以保證行的長度不會超過 width。 如果為假值,超長單詞不會被分開,因而某些行的長度可能會超過 width。 (

  • break_on_hyphens:(默認: True) 如果為真值,將根據英語的慣例首選在空白符和復合詞的連字符之后自動換行。 如果為假值,則只有空白符會被視為合適的潛在斷行位置,但如果你確實不希望出現分開的單詞則你必須將
    break_long_words 設為假值。

  • max_lines:(默認: None) 如果不為 None,則輸出內容將最多包含 max_lines 行,並使 placeholder 出現在輸出內容的末尾。

  • placeholder:(默認: ' […]') 該文本將在輸出文本被截短時出現在文本末尾。

示例展示

wrap函數的示例如下:

import textwrap

str_data = """
  哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈       懷舊服         翻山倒海   不會發生代表/n會盡快發貨時.?electroencephalography 
"""
print(str_data)
print(textwrap.wrap(str_data, width=5))
print(textwrap.wrap(str_data, initial_indent='&&'))
print(textwrap.wrap(str_data, subsequent_indent='10'))
print(textwrap.wrap(str_data, expand_tabs=False))
print(textwrap.wrap(str_data, tabsize=5))
print(textwrap.wrap(str_data, width=5, replace_whitespace=False))
print(textwrap.wrap(str_data, width=5, fix_sentence_endings=True))
print(textwrap.wrap(str_data, width=5, break_long_words=False))
print(textwrap.wrap(str_data, width=5, break_on_hyphens=True))
print(textwrap.wrap(str_data, width=5, drop_whitespace=True))
print(textwrap.wrap(str_data, width=5, max_lines=1, placeholder='》》》》》'))

運行結果

  哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       懷舊服         翻山倒海   不會發生代表/n會盡快發貨時.?electroencephalography 

['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '懷舊服', '翻山倒海', '不會發生代', '表/n會盡', '快發貨時.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['&&   哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       懷舊服         翻山倒海', '不會發生代表/n會盡快發貨時.?electroencephalography']
['   哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       懷舊服         翻山倒海', '10不會發生代表/n會盡快發貨時.?electroencephalography']
['   哈哈 哈啊哈哈 啊哈哈哈啊哈哈哈       懷舊服         翻山倒海', '不會發生代表/n會盡快發貨時.?electroencephalography']
['   哈哈 哈啊哈哈 啊哈哈哈啊哈哈哈       懷舊服         翻山倒海', '不會發生代表/n會盡快發貨時.?electroencephalography']
['\n  哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '懷舊服', '翻山倒海', '不會發生代', '表/n會盡', '快發貨時.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '懷舊服', '翻山倒海', '不會發生代', '表/n會盡', '快發貨時.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊哈哈哈', '懷舊服', '翻山倒海', '不會發生代表/n會盡快發貨時.?electroencephalography']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '懷舊服', '翻山倒海', '不會發生代', '表/n會盡', '快發貨時.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['   哈哈', '哈啊哈哈', '啊哈哈哈啊', '哈哈哈', '懷舊服', '翻山倒海', '不會發生代', '表/n會盡', '快發貨時.', '?elec', 'troen', 'cepha', 'logra', 'phy']
['》》》》》']

Process finished with exit code 0

fill函數的示例如下:

  • fill函數和wrap函數都是共用TextWrapper類實現的,兩個函數唯一的區別就是,wrap函數返回的是列表類型,fill函數返回的是字符串類型

shorten函數的示例如下:

  • shorten函數和fill函數、wrap函數的區別就是它的width參數是必傳的,最后返回的都是折疊的數據
import textwrap

str_data = """
  哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈       懷舊服         翻山倒海   不會發生代表/n會盡快發貨時.?electroencephalography 
"""
print(str_data)
print(textwrap.shorten(str_data, width=5))
print(textwrap.shorten(str_data, width=10, initial_indent='&&'))
print(textwrap.shorten(str_data, width=5, subsequent_indent='10'))
print(textwrap.shorten(str_data, width=5, expand_tabs=False))
print(textwrap.shorten(str_data, width=5, tabsize=5))
print(textwrap.shorten(str_data, width=5, replace_whitespace=False))
print(textwrap.shorten(str_data, width=5, fix_sentence_endings=True))
print(textwrap.shorten(str_data, width=5, break_long_words=False))
print(textwrap.shorten(str_data, width=5, break_on_hyphens=True))
print(textwrap.shorten(str_data, width=5, drop_whitespace=True))
print(textwrap.shorten(str_data, width=5, placeholder='...'))

運行結果

  哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       懷舊服         翻山倒海   不會發生代表/n會盡快發貨時.?electroencephalography 

[...]
&&哈哈 [...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
[...]
哈哈...

Process finished with exit code 0

dedent函數的示例如下:

  • 移除 text 中每一行的任何相同前綴空白符
import textwrap

str_data = """
  哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈       懷舊服         翻山倒海   不會發生代表/n會盡快發貨時.?electroencephalography 
"""
print(str_data)
print(textwrap.dedent(str_data))

運行結果

  哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       懷舊服         翻山倒海   不會發生代表/n會盡快發貨時.?electroencephalography 


哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈       懷舊服         翻山倒海   不會發生代表/n會盡快發貨時.?electroencephalography 

dedent函數的示例如下:

  • 將 prefix 添加到 text 中選定行的開頭
import textwrap

str_data = """
/n/n哈哈\t哈啊哈哈\t啊哈哈哈啊哈哈哈懷舊服翻山倒海不會發生代表/n會盡快發貨時.?electroencephalography 
"""
print(str_data)
print(textwrap.indent(str_data, prefix='    '))

運行結果

/n/n哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈懷舊服翻山倒海不會發生代表/n會盡快發貨時.?electroencephalography 


    /n/n哈哈    哈啊哈哈    啊哈哈哈啊哈哈哈懷舊服翻山倒海不會發生代表/n會盡快發貨時.?electroencephalography 


Process finished with exit code 0
  • 可選的 predicate 參數可用來控制哪些行要縮進。 例如,可以很容易地為空行或只有空白符的行添加 prefix:
import textwrap

str_data = """
哈哈哈啊\n哈哈啊哈哈哈\n啊哈哈哈懷舊服\n翻山\n倒海不會發生代表\n會盡快發貨時.?electroencephalography 
"""
print(str_data)
print("_" * 50)
print(textwrap.indent(str_data, ' +'))
print("_" * 50)
print(textwrap.indent(str_data, ' +', lambda line: True))

運行結果

哈哈哈啊
哈哈啊哈哈哈
啊哈哈哈懷舊服
翻山
倒海不會發生代表
會盡快發貨時.?electroencephalography 

__________________________________________________

 +哈哈哈啊
 +哈哈啊哈哈哈
 +啊哈哈哈懷舊服
 +翻山
 +倒海不會發生代表
 +會盡快發貨時.?electroencephalography 

__________________________________________________
 +
 +哈哈哈啊
 +哈哈啊哈哈哈
 +啊哈哈哈懷舊服
 +翻山
 +倒海不會發生代表
 +會盡快發貨時.?electroencephalography 


Process finished with exit code 0

以上總結或許能幫助到你,或許幫助不到你,但還是希望能幫助到你,如有疑問、歧義,直接私信留言會及時修正發布;非常期待你的點贊和分享喲,謝謝!

未完,待續…

一直都在努力,希望您也是!

微信搜索公眾號:就用python

文章作者:李 鋒|編輯排版:梁莉莉

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM