字符串换行截取_textwrap 文本自动换行与填充
前情提示: 測試代碼中,右尖括號(>)表示命令行中輸入的命令;單獨一行并以井字符(#)開頭的為輸出結構;庫的導入僅在本文的第一個測試代碼中展現,其他代碼塊均省略庫的導入代碼。
系統類型:?Windows 10
python 版本:?Python 3.9.0
textwrap?可以將文本字符串按照一定的規則換行,或在對文本字符串進行一些簡單的處理。
textwrap?模塊提供了一些快捷函數,通常情況下這些快捷函數就足夠滿足需求,如果無與需求相符的快捷函數,還可以自定義?TextWrapper?類來滿足需求。
快捷函數
textwrap.wrap(text, width=70, **kwargs)
自動換行并以列表類型返回
參數:text: str,要處理的字符串
width: int,默認為 70,每行字符最大數量
**kwargs: 可選參數,與 TextWrapper 實例中的參數相同
返回值:
list[str, str, str, ...],包含一個或多個 str 類型子元素的列表
對?text?以每行?width?個字符自動換行,所有行組成列表返回,行尾不帶換行符。
import textwraps1 = 'abcdefghijklmnopqrstuvwxyz'
print(textwrap.wrap(s1, 7))
# ['abcdefg', 'hijklmn', 'opqrstu', 'vwxyz']
s11 = 'ab\ncd efghijklmnop'
print(textwrap.wrap(s11, 10))
# ['ab cd e', 'fghijklmno', 'p']
對于表示換行的特殊字符?\n?被轉換成空格,轉換后的空格被當作了一個字符來處理。那么就來測試測試所有轉義字符:
s11 = 'start\a\b\f\n\r\t\v\\\'\"\0end'print(textwrap.fill(s11, 30))
# ['start\x07\x08 \\\'"\x00end']
\a,\b,被轉換成了16進制的字符,?\f、\n、\r、\t、\v?都被轉換成了空格,\\、\'、\"?正常轉義了,它們本身就代表一個字符,而不像前面一些轉義字符一樣有特殊功能。\0?直接消失了,它本身代表的意義就是空字符,那應該也是沒有被轉換。
textwrap.fill(text, width=70, **kwargs)
自動換行并返回新字符串
參數:text: str,要處理的字符串
width: int,默認為 70,每行字符最大數量
**kwargs: 可選參數,與 TextWrapper 實例中的參數相同
返回值:
str,一個一行或多行的字符串
對?text?以每行?width?個字符自動換行(每隔?width?個字符就在其字符后添加?\n?字符),返回值為字符串,相當于?'\n'.join(['a', 'b', 'c'])
s1 = 'abcdefghijklmnopqrstuvwxyz'print(textwrap.fill(s1, 7))
# abcdefg
# hijklmn
# opqrstu
# vwxyz
s11 = 'start\a\b\f\n\r\t\v\\\'\"\0end'
print(textwrap.fill(s11, 30))
# star \'"end
textwrap.fill()?函數也有?textwrap.wrap()?函數類似的特性,會將一部分專業字符轉換成空格。
textwrap.shorten(text, width, **kwargs)
折疊空格并截短字符串
參數:text: str,要處理的字符串
width: int,默認為 70,每行字符最大數量
**kwargs: 可選參數,與 TextWrapper 實例中的參數相同
返回值:
str,一個一行的字符串
將?text?中的多個連續空格折疊為一個,并且按照?width?給出的長度截取字符串并添加后綴,截取的字符串加后綴的長度不大于?width。截短內容以單詞為單位截短。
控制后綴的參數為?placeholder,默認值為?[...],并且后綴會占用要求的最大長度,也就是說,加上后綴,截取后的字符串小于或等于?width?參數設置的值。
s2 = 'test test test test'print(textwrap.shorten(s2, 12, placeholder='...'))
# test test...
print(textwrap.shorten(s2, 11, placeholder='...'))
# test...
在第一個示例中,將空格折疊后,test test?共計?9?個字符,加上后綴?...,剛巧?12?個字符,與?width?參數指定的?12?個字符相等,在第二個示例中,test test?加后綴?...?超過了?width?參數指定的?11?個字符,那么只能再縮短一個單詞,也就是結果展示的?test...。
textwrap.dedent(text)
移除所有行的相同前綴空白符
參數:text: str,要處理的字符串
返回值:
str,一行或多行字符串
找到所有行中前綴空白符最短的一個,然后所有行移除同等數量的前綴空白符。
s = '''aaa
bbb'''
print(textwrap.dedent(s))
#
# aaa
# bbb
s = '''
\t\taaa
\tbbb'''
print(textwrap.dedent(s))
#
# aaa
# bbb
s = '''
aaa
\tbbb'''
print(textwrap.dedent(s))
#
# aaa
# bbb
空格和?\t?轉義字符都屬于空白符,但是二者并不相同,在小編的測試環境中,\t?符與?8?個空格展示效果相似,但是卻沒有被移除,說明二者并不被認定為是相同的前綴字符串。
textwrap.indent(text, prefix, predicate=None)
在指定行的開頭添加字符
參數:text: str,要處理的字符串
prefix: str,添加到行開頭的字符串
predicate: 可傳入一個匿名函數,默認為 None
返回值:
str,一個一行或多行的字符串
將?prefix?添加到?text?中每行子字符串中,可以通過?predicate?參數傳入一個匿名函數來篩選符合條件的行添加?prefix。默認情況下,prefix?會添加到?text?的所有不是只由空白符(包括任何行結束符)組成的行中。
s4 = 'aaa\n bbb \nccc \n'print(textwrap.indent(s4, '+'))
# +aaa
# + bbb
# +ccc
#
print(textwrap.indent(s4, '+', lambda line: line[:1] == ' ')) # 指定行第一個字符是空格的
# aaa
# + bbb
# ccc
#
class textwrap.TextWrapper(**kwargs)
TextWrapper?構造器接受多個可選的關鍵字參數,也可以在實例化后設置其屬性。以下兩個對象是類似的。
wr1 = textwrap.TextWrapper()wr1.width = 9
wr2 = textwrap.TextWrapper(width=9)
TextWrapper 類包含的屬性
width?-- 默認為?70,自行換行的最大行長度。
expand_tabs?-- 默認為?True,如果為?True?則字符串中的制表符將使用字符串的?expandtabs()?方法擴展為空格。
tabsize?-- 默認為?8,控制字符串的制表符被擴展為空格時轉換的數量,僅在?expand_tabs?為?True?時有效。
replace_whitespace?-- 默認為?True,使用?wrap()?方法會先將字符串中的空白字符(制表符,換行符,垂直制表,進紙,回車)替換為單個空格。
drop_whitespace?-- 默認為?True,每一行開頭和末尾的空白字符(在包裝之后、縮進之前)會被丟棄。但是段落開頭的空白字符如果后面不帶任何非空白字符則不會被丟棄。如果被丟棄的空白字符占據了一個整行,則該整行將被丟棄。
initial_indent?-- 默認為?'',將被添加到被自動換行輸出內容的第一行的字符串。其長度會被計入第一行的長度。空字符串不會被縮進。
subsequent_indent?-- 默認為?'',將被添加到被自動換行輸出內容除第一行外的所有行的字符串。其長度會被計入除行一行外的所有行的長度。
fix_sentence_endings?-- 默認為?False,將嘗試檢測句子結尾并確保句子間總是以恰好兩個空格符分隔。
break_long_words?-- 默認為?True,單詞長度超過?width?值是是否要分開。
break_on_hyphens?-- 默認為?True,True: 將根據英文慣例首選在空白符和復合詞的連字符之后自動換行;?False: 只有空白符會被視為合適的潛在斷行位置。
max_lines?-- 默認為?None,輸出字符串最大行數。
placeholder?-- 默認為?'[...]',輸出被截短文本時,末尾填充的子字符串。
TextWrapper 類包含的方法
wrap(text)?-- 對?text?(字符串) 中的單獨段落自動換行以使每行長度最多為?width?個字符。所有自動換行選項均獲取自?TextWrapper?實例的實例屬性。返回由輸出行組成的列表,行尾不帶換行符。如果自動換行輸出結果沒有任何內容,則返回空列表。
fill(text)?-- 對?text?中的單獨段落自動換行并返回包含被自動換行段落的單獨字符串。
簡單的示例
'''每7個字符自動換行,不轉換空白字符,并且第一行行前添加 '--' 前綴'''wr = textwrap.TextWrapper()
wr.width = 7
wr.replace_whitespace = False
wr.initial_indent = '--'
print(wr.wrap('a\f\v\nbcdefghijklmn'))
# ['--a\x0c\x0b\nb', 'cdefghi', 'jklmn']
參考資料
源代碼:?Lib/textwrap.py
官方文檔:https://docs.python.org/zh-cn/3/library/textwrap.html
總結
以上是生活随笔為你收集整理的字符串换行截取_textwrap 文本自动换行与填充的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 别等降价了!长城坦克推全年保价政策 年底
- 下一篇: 24岁姑娘制作退休倒计时日历:攒够200