Python技巧 - 格式化字符串

概述

格式化字符串語法,常常被使用。除了基本的'{}'.format(1)位置和'{name}'.format(name="name")格式化字符串還具備很是強大的功能,在工做中偶爾會用到,每次都得查一下很煩,因此寫篇文章記錄一下。python

如下是官方文檔中給出的規則描述git

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name       ::=  arg_name ("." attribute_name | "[" element_index "]")*
arg_name         ::=  [identifier | digit+]
attribute_name    ::=  identifier
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +
conversion        ::=  "r" | "s" | "a"
format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
複製代碼

解釋一下符號的含義:json

  • ::=左邊是聲明的一個概念名稱, 右邊是具體的規則
  • "" 表示具體的某個字符
  • []表示該部分可選
  • |表明多選一
  • <>中是描述信息
  • +表示一個或者多個
  • *表示0個或多個

本章對這些規則進行一些舉例和講解bash

指定格式化的參數 [field_name]

默認值

"{}{}".format(1,2) 等價於 "{0}{1}.format(1,2)"
複製代碼

支持替換位置參數(*args)和命名參數(**kwargs)

In [6]: "{2}{1}{0}".format('a', 'b', 'c')
Out[6]: 'cba'

In [7]: "{a}{b}{c}".format(a='a', b='b', c='c')
Out[7]: 'abc'

In [8]: "{a}{1}{b}{0}{c}".format('x', 'y', a='a', b='b', c='c')
Out[8]: 'aybxc'
複製代碼

支持 [0], . 兩種運算符

In [22]: "{[0]}".format(['a'])
Out[22]: 'a'

In [23]: "{0[0]}".format(['a'])
Out[23]: 'a'

In [24]: "{0['a']}".format({'a': 1})
KeyError: "'a'"

In [25]: "{o.__name__}".format(o=object)
Out[25]: 'object'
複製代碼

指定參數轉化成字符的方法 [!conversion]

**支持repr() ascii() str()三種轉化方式, 默認str()ide

"".format('中文')ui

In [47]: "{!s}".format('中文') == str('中文')
Out[47]: True

In [48]: "{!r}".format('中文') == repr('中文')
Out[48]: True

In [49]: "{!a}".format('中文') == ascii('中文')
Out[49]: True

In [56]: "{}".format('中文') == str('中文')
Out[56]: True
複製代碼

字符的排版 [:format_spec]

字符默認寬度和填充 [fill][width]

In [133]: "{:05}".format(1)
Out[133]: '00001'

In [134]: "{: 5}".format(1) # 默認
Out[134]: ' 1'
複製代碼

一些填充沒法使用一些特殊的字符,好比*,spa

In [136]: "{:*5}".format(1)
ValueError: Invalid format specifier
複製代碼

對齊方式 [align]

  1. <, >, ^分別對應左對齊,右對齊,居中對齊
In [142]: "{:>10}".format('right')
Out[142]: ' right'

In [143]: "{:<10}".format('left')
Out[143]: 'left '

In [144]: "{:^10}".format('center')
Out[144]: ' center '
複製代碼
  1. 當數字顯示爲帶符號的狀況下默認的處理方式符號將緊根數字,=符號能夠強行將符號放在填充字符的前面
In [140]: "{:=10}".format(-1)
Out[140]: '- 1'

In [141]: "{:10}".format(-1)
Out[141]: ' -1'
複製代碼

數字符號處理 [sign]

  1. :<空格>, +不會顯示會用空格進行替代
In [112]: "{: }".format(-1)
Out[112]: '-1'

In [113]: "{: }".format(1)
Out[113]: ' 1'
複製代碼
  1. :- (默認值),正數不顯示符號,負數顯示
In [116]: "{:-}".format(-1)
Out[116]: '-1'

In [117]: "{:-}".format(1)
Out[117]: '1'
複製代碼
  1. :+,正負號都顯示
In [114]: "{:+}".format(1)
Out[114]: '+1'

In [115]: "{:+}".format(-1)
Out[115]: '-1'
複製代碼

千分位分隔符 [grouping_option]

只支持,_分隔code

In [145]: "{:,}".format(10000)
Out[145]: '10,000'

In [146]: "{:_}".format(10000)
Out[146]: '10_000'
複製代碼

浮點數保留小數點位數 [.precision]

In [151]: "{:.3f}".format(1.2)
Out[151]: '1.200'

In [152]: "{:.3f}".format(1.2123)
Out[152]: '1.212'
複製代碼

格式化輸出字符的類型 [#][0][type]

  1. 整數類型 "b" | "c" | "d" | "o" | "x" | "X" | 'n', 默認值"d"

進制orm

In [161]: "{:b}".format(1000) # 二進制
Out[161]: '1111101000'

In [162]: "{:o}".format(1000) # 八進制
Out[162]: '1750'

In [163]: "{:d}".format(1000) # 十進制
Out[163]: '1000'

In [164]: "{:x}".format(1000) # 十六進制小寫
Out[164]: '3e8'

In [165]: "{:X}".format(1000) # 十六進制大寫
Out[165]: '3E8'
複製代碼

顯示進制的符號ci

In [161]: "{:#0b}".format(1000) # 二進制
Out[161]: '0b1111101000'

In [162]: "{:#0o}".format(1000) # 八進制
Out[162]: '0o1750'

In [164]: "{:#0}".format(1000) # 十六進制小寫
Out[164]: '0x3e8'

In [165]: "{:#0X}".format(1000) # 十六進制大寫
Out[165]: '0X3E8'
複製代碼

按照ascii碼將數字轉化成字符

In [177]: "{:c}".format(65)
Out[177]: 'A'

In [178]: "{:n}".format(65)
Out[178]: '65'
複製代碼

"n" 和 "d"的區別

In [171]: "{:,d}".format(1000)
Out[171]: '1,000'

In [172]: "{:,n}".format(1000)
ValueError: Cannot specify ',' with 'n'.
複製代碼
  1. 浮點數類型 "e" | "E" | "f" | "F" | "n" | "%" 默認的小數位數是6
import math
In [224]: "{:e}".format(666666.46)  # 科學計數法小寫
Out[224]: '6.666665e+05'

In [225]: "{:E}".format(666666.56)  # 科學計數法大寫
Out[225]: '6.666666E+05'

In [226]: "{:f}".format(666666.44)
Out[226]: '666666.440000'

In [234]: "{:f}".format(math.nan)
Out[234]: 'nan'

In [235]: "{:F}".format(math.nan)
Out[235]: 'NAN'

In [236]: "{:%}".format(666666.66)
Out[236]: '66666666.000000%'
複製代碼

轉義{}

若是但願獲得字符{或者}能夠使用{{}}進行轉義

好比要表示一個json時

In [53]: '{{"a": 1, "b": {}}}'.format(2)
Out[53]: '{"a": 1, "b": 2}'
複製代碼
相關文章
相關標籤/搜索