Python的格式化文本

python.png

文:張利東
公眾號(hào):DongTalks


1. 緣起

程序處理無非輸入、處理和輸出,其中輸出以文本居多,文本的格式化是繞不過去的問題,不如索性好好研究一下搞定,省的每次遇到都尷尬。

2. 探索

根據(jù)PEP 3101,Python有兩種典型的文本格式化方法

  • The '%' operator for strings.
  • The string.Template module.

其中%的方法和C語言printf的格式化很像,簡單實(shí)用,但在Python里面有很多問題,比如處理tuples 和 dictionaries時(shí)候就容易出錯(cuò)。string.Template用的是類似的Format String Syntax語法,很好的解決了這些問題,而且功能更強(qiáng)大。但強(qiáng)大也帶來了復(fù)雜性,F(xiàn)ormat語法比%要復(fù)雜的多。

2.1. % Style

%風(fēng)格來自C語言的printf,但也有一些不同。標(biāo)準(zhǔn)的C語言格式為

%[parameter][flags][width][.precision][length]type

Python去掉了parameter參數(shù),在其位置增加了Mapping key。根據(jù)Python文檔,其關(guān)鍵語法為

  1. The '%' character, which marks the start of the specifier.
  2. Mapping key (optional), consisting of a parenthesised sequence of characters (for example, (somename)).
  3. Conversion flags (optional), which affect the result of some conversion types.
  4. Minimum field width (optional). If specified as an '*' (asterisk), the actual width is read from the next element of the tuple in values, and the object to convert comes after the minimum field width and optional precision.
    Precision (optional), given as a '.' (dot) followed by the precision. If specified as '*' (an asterisk), the actual precision is read from the next element of the tuple in values, and the value to convert comes after the precision.
  5. Length modifier (optional).
  6. Conversion type.

Maping Key主要是為了解決類似Dict一類參數(shù)的調(diào)用問題。但這種解決方式不太優(yōu)雅,這種復(fù)雜格式還是用后面談到的Format Syntax為妙。

具體各參數(shù)的應(yīng)用,可參見Python文檔《printf-style String Formatting》。其典型應(yīng)用有如下代碼

>>> p = 'This is a test for %012.2f.' % 100.123
>>> p
'This is a test for 000000100.12.'

其中

  1. %表示格式化開始;
  2. Mapping參數(shù)省略;
  3. 0為flag,代表占位符,位數(shù)不足時(shí)用它填充;
  4. 12為小數(shù)點(diǎn)前面最小長度,不足處用flag填充;
  5. .2表示小數(shù)點(diǎn)后面精確位數(shù);
  6. f表示浮點(diǎn)數(shù)類型;

2.2. Format Style

Format Sytle是Python在2.6版本里面引入的一種文本格式化的方法。其主要格式為

"string content {[replacement_field]}".format(content)

其中,replacement_field 的典型格式為 "{" [field_name] ["!" conversion] [":" format_spec] "}"。

field_name是變量標(biāo)記,!:是分隔符,分別區(qū)分conversionformat_spec。

conversion有三種方法,"r" | "s" | "a"。雖然文檔沒有明說,但想來默認(rèn)應(yīng)該是"s"吧。

format_spec內(nèi)容比較復(fù)雜,也是這種方法強(qiáng)大所在。其語法結(jié)構(gòu)為

[[fill]align][sign][#][0][width][grouping_option][.precision][type]

其中

  • fill表示填充;
  • align表示對(duì)齊;
  • sign表示正負(fù)號(hào);
  • #表示進(jìn)制選擇;
  • 0沒搞明白是什么;
  • width表示文字寬度;
  • grouping_option表示千分位開關(guān);
  • precision表示小數(shù)點(diǎn)后精度;
  • type表示類型;

其中type可以參考% Style,大同小異;也可以參考官方文檔。其典型應(yīng)用有如下代碼

>>> s = 'This is a test for {:$^+016,.2f}.'.format(100.123)
>>> s
'This is a test for $$$$+100.12$$$$$.'

這個(gè)0還是沒有搞清楚是干嘛的,難不成是打醬油的……

3. 總結(jié)

今天我們大致總結(jié)了Python里面文本輸出的格式問題。國慶最后幾天搞定了這件事情,挺開心。

這幾天看王興的微博,里面有段話挺讓人觸動(dòng)

如果我一整天都沒看到、想到、或做過什么值得在飯否上說的事,那這一天就太渾渾噩噩了。

日有所進(jìn),說起來容易,做起來其實(shí)很難。反思了一下自己,真不是每天都能吹吹牛。所以決定開啟一個(gè)「日拱一卒」的計(jì)劃,爭取每天都能有點(diǎn)收獲,有點(diǎn)能吹吹牛的事情。

今天么,就是大致搞明白了Python的這個(gè)格式化輸出。當(dāng)然,一如以往,還有一些沒有搞明白,比如那個(gè)0……囧。

你呢?

4. 參考文獻(xiàn):


2017-08-29-DongTalks.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容