前言:本文詳細(xì)整理了python字符串格式化的幾種方式。
一、使用 % 符號(hào)來(lái)進(jìn)行格式化
格式符為真實(shí)值預(yù)留位置,并控制顯示的格式。格式符可以包含有一個(gè)類型碼,用以控制顯示的類型,如下:
%s??? 字符串 (采用str()的顯示)
%r??? 字符串 (采用repr()的顯示)
%c??? 單個(gè)字符
%b??? 二進(jìn)制整數(shù)
%d??? 十進(jìn)制整數(shù)
%i??? 十進(jìn)制整數(shù)
%o??? 八進(jìn)制整數(shù)
%x??? 十六進(jìn)制整數(shù)
%e??? 指數(shù) (基底寫(xiě)為e)
%E??? 指數(shù) (基底寫(xiě)為E)
%f??? 浮點(diǎn)數(shù)
%F??? 浮點(diǎn)數(shù),與上相同
%g??? 指數(shù)(e)或浮點(diǎn)數(shù) (根據(jù)顯示長(zhǎng)度)
%G??? 指數(shù)(E)或浮點(diǎn)數(shù) (根據(jù)顯示長(zhǎng)度)
%%??? 字符"%",顯示百分號(hào)%
另外,比如我要固定字符的寬度,小數(shù)精度等,可以用如下的方式,對(duì)格式進(jìn)行進(jìn)一步的控制:
%[(name)][flags][width].[precision] typecode
(1)(name)為命名:即參數(shù)的名稱,可以沒(méi)有這個(gè),怎么使用呢?注意(name需要使用括號(hào)括起來(lái)哦!?。。?/p>
#?注意:這里的name,num括號(hào)不能掉
'Hey?%(name)s,?there?is?a?%(num)f?number!'?%?{"name":?name,?"num":?number?}
(2)flags可以有+,-,' '或0。+表示右對(duì)齊。-表示左對(duì)齊。' '為一個(gè)空格,表示在正數(shù)的左側(cè)填充一個(gè)空格,從而與負(fù)數(shù)對(duì)齊。0表示左側(cè)使用0填充。
(3)width表示顯示寬度
(4)precision表示小數(shù)點(diǎn)后精度
?
注意:百分號(hào)% 來(lái)格式化字符串是最早出現(xiàn)的,python里面稱之為printf風(fēng)格的字符串格式化,參考官方文檔:
https://docs.python.org/zh-cn/3.7/library/stdtypes.html#old-string-formatting
?
二、使用.format的格式
字符串類型格式化采用format()方法,基本使用格式是:
?????<模板字符串>.format(<逗號(hào)分隔的參數(shù)>)
2. 1 格式控制信息
format()方法中<模板字符串>的槽除了包括參數(shù)序號(hào),還可以包括格式控制信息。此時(shí),槽的內(nèi)部樣式如下:
{<參數(shù)序號(hào)>: <格式控制標(biāo)記>}? ?# 中間使用了一個(gè)冒號(hào)哦!
其中,<格式控制標(biāo)記>用來(lái)控制參數(shù)顯示時(shí)的格式,包括:<填充><對(duì)齊><寬度><,><.精度><類型>6 個(gè)字段,這些字段都是可選的,可以組合使用,逐一介紹如下。

(1)<填充>
指<寬度>內(nèi)除了參數(shù)外的字符采用什么方式表示,默認(rèn)采用空格,可以通過(guò)<填充>更換。
(2)<對(duì)齊>
指參數(shù)在<寬度>內(nèi)輸出時(shí)的對(duì)齊方式,分別使用<、>和^三個(gè)符號(hào)表示左對(duì)齊、右對(duì)齊和居中對(duì)齊。
(3)<寬度>
指當(dāng)前槽的設(shè)定輸出字符寬度,如果該槽對(duì)應(yīng)的format()參數(shù)長(zhǎng)度比<寬度>設(shè)定值大,則使用參數(shù)實(shí)際長(zhǎng)度。如果該值的實(shí)際位數(shù)小于指定寬度,則位數(shù)將被默認(rèn)以空格字符補(bǔ)充。
s?=?"PYTHON"
"{0:30}".format(s)
Out[17]:?'PYTHON????????????????????????'
"{0:>30}".format(s)
Out[18]:?'????????????????????????PYTHON'
"{0:*^30}".format(s)
Out[19]:?'************PYTHON************'
"{0:-^30}".format(s)
Out[20]:?'------------PYTHON------------'
"{0:3}".format(s)
Out[21]:?'PYTHON'
(4)逗號(hào)(,)
<格式控制標(biāo)記>中逗號(hào)(,)用于顯示數(shù)字的千位分隔符,例如:
"{0:-^20,}".format(1234567890)
Out[24]:?'---1,234,567,890----'
"{0:-^20}".format(1234567890)?#對(duì)比輸出
Out[25]:?'-----1234567890-----'
"{0:-^20,}".format(12345.67890)
Out[26]:?'----12,345.6789-----'
?(5)<.精度>? ?# 注意:前面有一個(gè)小數(shù)點(diǎn)哦!
表示兩個(gè)含義,由小數(shù)點(diǎn)(.)開(kāi)頭。對(duì)于浮點(diǎn)數(shù),精度表示小數(shù)部分輸出的有效位數(shù)。對(duì)于字符串,精度表示輸出的最大長(zhǎng)度。
"{0:.2f}".format(12345.67890)
Out[29]:?'12345.68'
"{0:H^20.3f}".format(12345.67890)
Out[30]:?'HHHHH12345.679HHHHHH'
"{0:.4}".format("PYTHON")
Out[31]:?'PYTH'
(6)<類型>
表示輸出整數(shù)和浮點(diǎn)數(shù)類型的格式規(guī)則。對(duì)于整數(shù)類型,輸出格式包括6 種:
b: 輸出整數(shù)的二進(jìn)制方式;
c: 輸出整數(shù)對(duì)應(yīng)的 Unicode 字符;
d: 輸出整數(shù)的十進(jìn)制方式;
o: 輸出整數(shù)的八進(jìn)制方式;
x: 輸出整數(shù)的小寫(xiě)十六進(jìn)制方式;
X: 輸出整數(shù)的大寫(xiě)十六進(jìn)制方式;
"{0:b},{0:c},{0:d},{0:o},{0:x},{0:X}".format(425)
Out[32]:?'110101001,?,425,651,1a9,1A9'
對(duì)于浮點(diǎn)數(shù)類型,輸出格式包括4 種:
e: 輸出浮點(diǎn)數(shù)對(duì)應(yīng)的小寫(xiě)字母 e 的指數(shù)形式;
E: 輸出浮點(diǎn)數(shù)對(duì)應(yīng)的大寫(xiě)字母 E 的指數(shù)形式;
f: 輸出浮點(diǎn)數(shù)的標(biāo)準(zhǔn)浮點(diǎn)形式;
%: 輸出浮點(diǎn)數(shù)的百分形式。
?????浮點(diǎn)數(shù)輸出時(shí)盡量使用<.精度>表示小數(shù)部分的寬度,有助于更好控制輸出格式。
"{0:e},{0:E},{0:f},{0:%}".format(3.14)
Out[33]:?'3.140000e+00,3.140000E+00,3.140000,314.000000%'
"{0:.2e},{0:.2E},{0:.2f},{0:.2%}".format(3.14)
Out[34]:?'3.14e+00,3.14E+00,3.14,314.00%'
?三、f-string來(lái)格式化字符串——python3.6以上
f-string采用?{content:format}?設(shè)置字符串格式,其中?content?是替換并填入字符串的內(nèi)容,可以是變量、表達(dá)式或函數(shù)等,format?是格式描述符。采用默認(rèn)格式時(shí)不必指定?{:format},如上面例子所示只寫(xiě)?{content}?即可。
關(guān)于格式描述符的詳細(xì)語(yǔ)法及含義可查閱Python官方文檔,這里按使用時(shí)的先后順序簡(jiǎn)要介紹常用格式描述符的含義與作用:
關(guān)于這個(gè)format的格式,我們依然使用前面的方法二種format來(lái)格式化字符串的順序來(lái)說(shuō)明,也是按照下面這6個(gè)主要方面:
<填充><對(duì)齊><寬度><,><.精度><類型>6 個(gè)字段,但是還有所拓展
format_spec ?格式:???[[fill]align][sign][#][0][width][grouping_option][.precision][type]
即format一般的格式為
[填充字符][對(duì)齊方式][數(shù)字的正負(fù)號(hào)顯示][#][0][寬度][千分位分組符號(hào)][.小數(shù)精度][類型]
(1)填充 fill :?????可以是任何的字符
(2)對(duì)齊 align:?????"<"?|?">"?|?"="?|?"^"
(3)符號(hào) sign :?????這個(gè)僅僅對(duì)數(shù)值有效?"+"?|?"-"?|?"?"
(4)寬度 width:?????是一個(gè)整數(shù)數(shù)值,表示多少寬度
(5)grouping_option:表示千分位的分隔符號(hào),可以是??"_"?|?","
(6)精度 precision :.數(shù)字?
(7)類型 type :?????"b"?|?"c"?|?"d"?|?"e"?|?"E"?|?"f"?|?"F"?|?"g"?|?"G"?|?"n"?|?"o"?|?"s"?|?"x"?|?"X"?|?"%"
下面是一些詳細(xì)說(shuō)明
(2)對(duì)齊align
| 對(duì)其align | 含義與作用 |
|---|
| < | 左對(duì)齊(字符串默認(rèn)對(duì)齊方式) |
| > | 右對(duì)齊(數(shù)值默認(rèn)對(duì)齊方式) |
| ^ | 居中 |
(3)符號(hào)sign
| 數(shù)字符號(hào)sign | 含義與作用 |
|---|
| + | 負(fù)數(shù)前加負(fù)號(hào)(-),正數(shù)前加正號(hào)(+) |
| - | 負(fù)數(shù)前加負(fù)號(hào)(-),正數(shù)前不加任何符號(hào)(默認(rèn)) |
| (空格) | 負(fù)數(shù)前加負(fù)號(hào)(-),正數(shù)前加一個(gè)空格 |
注:僅適用于數(shù)值類型。
(4)# 符號(hào)說(shuō)明
| # 描述符格式描述符 | 含義與作用 |
|---|
| # | 切換數(shù)字顯示方式 |
注1:僅適用于數(shù)值類型。
注2:#?對(duì)不同數(shù)值類型的作用效果不同,詳見(jiàn)下表:
| 數(shù)值類型 | 不加#(默認(rèn)) | 加# | 區(qū)別 |
|---|
| 二進(jìn)制整數(shù) | '1111011' | '0b1111011' | 開(kāi)頭是否顯示?0b |
| 八進(jìn)制整數(shù) | '173' | '0o173' | 開(kāi)頭是否顯示?0o |
| 十進(jìn)制整數(shù) | '123' | '123' | 無(wú)區(qū)別 |
| 十六進(jìn)制整數(shù)(小寫(xiě)字母) | '7b' | '0x7b' | 開(kāi)頭是否顯示?0x |
| 十六進(jìn)制整數(shù)(大寫(xiě)字母) | '7B' | '0X7B' | 開(kāi)頭是否顯示?0X |
(5)寬度與精度
寬度與精度相關(guān)格式描述符
| 格式描述符 | 含義與作用 |
|---|
width | 整數(shù)?width?指定寬度 |
0width | 整數(shù)?width?指定寬度,開(kāi)頭的?0?指定高位用?0?補(bǔ)足寬度 |
width.precision | 整數(shù)?width?指定寬度,整數(shù)?precision?指定顯示精度 |
注1:0width?不可用于復(fù)數(shù)類型和非數(shù)值類型,width.precision?不可用于整數(shù)類型。
注2:width.precision?用于不同格式類型的浮點(diǎn)數(shù)、復(fù)數(shù)時(shí)的含義也不同:用于?f、F、e、E?和?%?時(shí)?precision?指定的是小數(shù)點(diǎn)后的位數(shù),用于?g?和?G?時(shí)?precision?指定的是有效數(shù)字位數(shù)(小數(shù)點(diǎn)前位數(shù)+小數(shù)點(diǎn)后位數(shù))。
注3:width.precision?除浮點(diǎn)數(shù)、復(fù)數(shù)外還可用于字符串,此時(shí)?precision?含義是只使用字符串中前?precision?位字符。
(6)千位分隔符相關(guān)格式描述符
| 格式描述符 | 含義與作用 |
|---|
| , | 使用,作為千位分隔符 |
| _ | 使用_作為千位分隔符 |
注1:若不指定?,?或?_,則f-string不使用任何千位分隔符,此為默認(rèn)設(shè)置。
注2:,?僅適用于浮點(diǎn)數(shù)、復(fù)數(shù)與十進(jìn)制整數(shù):對(duì)于浮點(diǎn)數(shù)和復(fù)數(shù),,?只分隔小數(shù)點(diǎn)前的數(shù)位。
注3:_?適用于浮點(diǎn)數(shù)、復(fù)數(shù)與二、八、十、十六進(jìn)制整數(shù):對(duì)于浮點(diǎn)數(shù)和復(fù)數(shù),_?只分隔小數(shù)點(diǎn)前的數(shù)位;對(duì)于二、八、十六進(jìn)制整數(shù),固定從低位到高位每隔四位插入一個(gè)?_(十進(jìn)制整數(shù)是每隔三位插入一個(gè)?_)。
(7)類型描述
| 格式描述符 | 含義與作用 | 適用變量類型 |
|---|
s | 普通字符串格式 | 字符串 |
b | 二進(jìn)制整數(shù)格式 | 整數(shù) |
c | 字符格式,按unicode編碼將整數(shù)轉(zhuǎn)換為對(duì)應(yīng)字符 | 整數(shù) |
d | 十進(jìn)制整數(shù)格式 | 整數(shù) |
o | 八進(jìn)制整數(shù)格式 | 整數(shù) |
x | 十六進(jìn)制整數(shù)格式(小寫(xiě)字母) | 整數(shù) |
X | 十六進(jìn)制整數(shù)格式(大寫(xiě)字母) | 整數(shù) |
e | 科學(xué)計(jì)數(shù)格式,以?e?表示?×10^ | 浮點(diǎn)數(shù)、復(fù)數(shù)、整數(shù)(自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù)) |
E | 與?e?等價(jià),但以?E?表示?×10^ | 浮點(diǎn)數(shù)、復(fù)數(shù)、整數(shù)(自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù)) |
f | 定點(diǎn)數(shù)格式,默認(rèn)精度(precision)是6 | 浮點(diǎn)數(shù)、復(fù)數(shù)、整數(shù)(自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù)) |
F | 與?f?等價(jià),但將?nan?和?inf?換成?NAN?和?INF | 浮點(diǎn)數(shù)、復(fù)數(shù)、整數(shù)(自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù)) |
g | 通用格式,小數(shù)用?f,大數(shù)用?e | 浮點(diǎn)數(shù)、復(fù)數(shù)、整數(shù)(自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù)) |
G | 與?G?等價(jià),但小數(shù)用?F,大數(shù)用?E | 浮點(diǎn)數(shù)、復(fù)數(shù)、整數(shù)(自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù)) |
% | 百分比格式,數(shù)字自動(dòng)乘上100后按?f?格式排版,并加?%?后綴 | 浮點(diǎn)數(shù)、整數(shù)(自動(dòng)轉(zhuǎn)換為浮點(diǎn)數(shù)) |
常用的特殊格式類型:標(biāo)準(zhǔn)庫(kù)?datetime?給定的用于排版時(shí)間信息的格式類型,適用于?date、datetime?和?time?對(duì)象
| 格式描述符 | 含義 | 顯示樣例 |
|---|
%a | 星期幾(縮寫(xiě)) | 'Sun' |
%A | 星期幾(全名) | 'Sunday' |
%w | 星期幾(數(shù)字,0?是周日,6?是周六) | '0' |
%u | 星期幾(數(shù)字,1?是周一,7?是周日) | '7' |
%d | 日(數(shù)字,以?0?補(bǔ)足兩位) | '07' |
%b | 月(縮寫(xiě)) | 'Aug' |
%B | 月(全名) | 'August' |
%m | 月(數(shù)字,以?0?補(bǔ)足兩位) | '08' |
%y | 年(后兩位數(shù)字,以?0?補(bǔ)足兩位) | '14' |
%Y | 年(完整數(shù)字,不補(bǔ)零) | '2014' |
%H | 小時(shí)(24小時(shí)制,以?0?補(bǔ)足兩位) | '23' |
%I | 小時(shí)(12小時(shí)制,以?0?補(bǔ)足兩位) | '11' |
%p | 上午/下午 | 'PM' |
%M | 分鐘(以?0?補(bǔ)足兩位) | '23' |
%S | 秒鐘(以?0?補(bǔ)足兩位) | '56' |
%f | 微秒(以?0?補(bǔ)足六位) | '553777' |
%z | UTC偏移量(格式是?±HHMM[SS],未指定時(shí)區(qū)則返回空字符串) | '+1030' |
%Z | 時(shí)區(qū)名(未指定時(shí)區(qū)則返回空字符串) | 'EST' |
%j | 一年中的第幾天(以?0?補(bǔ)足三位) | '195' |
%U | 一年中的第幾周(以全年首個(gè)周日后的星期為第0周,以?0?補(bǔ)足兩位) | '27' |
%w | 一年中的第幾周(以全年首個(gè)周一后的星期為第0周,以?0?補(bǔ)足兩位) | '28' |
%V | 一年中的第幾周(以全年首個(gè)包含1月4日的星期為第1周,以?0?補(bǔ)足兩位) | '28' |
?
四、字符串模板 string template
從簡(jiǎn)單的例子看起
>>>?from?string?import?Template
>>>?s?=?Template('$who?likes?$what')
>>>?s.substitute(who='tim',?what='kung?pao')
'tim?likes?kung?pao'
>>>?d?=?dict(who='tim')
>>>?Template('Give?$who?$100').substitute(d)
Traceback?(most?recent?call?last):
...
ValueError:?Invalid?placeholder?in?string:?line?1,?col?11
>>>?Template('$who?likes?$what').substitute(d)
Traceback?(most?recent?call?last):
...
KeyError:?'what'
>>>?Template('$who?likes?$what').safe_substitute(d)
'tim?likes?$what'
詳細(xì)關(guān)于字符串模板的使用請(qǐng)參考官方文檔:
https://docs.python.org/3/library/string.html