Python 舊式 printf 風格字串格式化使用說明

閱讀 7:40·字數 2302·發佈 
Youtube 頻道
訂閱 133

由於使用 Python 舊式 printf 風格進行字串格式化可能導致一些問題,因此,建議使用str型別的format方法,你可以檢視如何格式化 Python 字串?format,format_map 方法,Formatter 類別介紹一節來了解更多資訊。

Python 舊式 printf 風格字串格式化

Python 舊式的 printf 風格字串格式化,可以完成與 Pythonstr型別的format方法類似的效果,其語法格式如下。

format % values

format 值

format是需要進行格式化的 Python 字串,字串中包含數個以%開頭的轉換符,這些轉換符將被values提供的值代替。

values 值

values是一個 Python 元組或字典物件,元組中的元素或字典中的鍵值組將代替 Python 字串中的轉換符。如果在format對應的字串中,僅包含一個轉換符,那麽values可以是其他型別的物件。

如果values是 Python 元組,那麽該元組中的元素將依次取代字串中的轉換符,此時元組所包含的元素的個數需要與字串中的轉換符的個數相同,否則會引發例外狀況TypeError: not enough arguments for format stringTypeError: not all arguments converted during string formatting。如果values是 Python 字典,那麽該字典所包含的鍵值組應能夠取代字串中所有的轉換符,否則將引發例外狀況KeyError

'%f %s' % (1.23, 4.56)
'1.230000 4.56'
'%(name)s %(age)d' % {'name': 'Jack', 'age': 12, 'passed': True}
'Jack 12'
'%f' % 123
'123.000000'

Python 舊式 printf 風格字串格式化中的轉換符

在使用 Python 舊式 printf 風格對字串進行格式化時,以%開頭的轉換符將被取代為其他內容,轉換符的格式如下。

%[(key)][sign][width][.precision]type[length]

key 值

values是一個 Python 字典時,key為字典某個鍵值組的鍵,該鍵值組的值將取代轉換符。

sign 值

如果sign包含0,那麽在擁有剩余空間的情況下,將自動為數值新增字元0。如果sign包含--會使0失效),那麽將在可用的空間內進行左對齊。如果sign包含 (空格),那麽將在正數前新增一個 (空格)。如果sign+-會使 失效),那麽將在數值前新增正號+或負號-。如果sign包含#,那麽將為整數顯示相關首碼,比如0o(八進位),0x0X(十六進位),或者強製為浮點數顯示小數點。

width 值

width表示轉換符占用的最小空間(長度),如果忽略他,則轉換符的空間由其對應的值來決定。如果width被設定為*,那麽values需要是一個 Python 元組,且元組接下來的元素表示轉換符占用的最小空間,而不是轉換符對應的值。

precision 值

precision表示轉換符的有效位數(數值超出有效位數時將被拾入),當typefFeE時,有效位數是指小數點後的位數(將自動補0)。當typegG時,有效位數是指小數點前後的所有位數(不會自動補0)。如果轉換符對應的值是 Python 字串,那麽字串的長度會被有效位數限製。如果precision被設定為*,那麽values需要是一個 Python 元組,且元組接下來的元素表示轉換符的有效位數,而不是轉換符對應的值。

type 值

type用於設定數值或字串的具體呈現方式。

length 值

length可以被設定為hlL,但不會產生任何實際效果。

'%+010d' % 1
'+000000001'
'%-010g' % 1.2
'1.2       '
'%(num)+#x' % {'num': 12}
'+0xc'
'%(num) #o' % {'num': 12}
' 0o14'
'%*d' % (5, 1234)
' 1234'
'%*f' % (5, 1234.56789)
'1234.567890'
'%.5e' % 1.23456789
'1.23457e+00'
'%.5g' % 1.23456789
'1.2346'
'%.*f' % (5, 1.23456789)
'1.23457'

使用 Python 舊式 printf 風格為數值和字串設定具體呈現方式

在使用 Python 舊式 printf 風格對字串進行格式化時,通過指定轉換符中的type,可以為轉換符對應的數值或字串設定具體的呈現方式,其具體的取值如下。

d(等價於已取代的u),i表示將數值顯示為十進位格式,o表示將數值顯示為八進位格式,x表示將數值顯示為十六進位格式,其中字母為小寫,X同樣表示將數值顯示為十六進位格式,但字母為大寫。

e表示將數值顯示為科學運算質,此時轉換符中的precision表示小數點後的位數,如果未指定precision,則有效位數預設為6Ee類似,但會采用大寫字母。

f表示將數值顯示為固定點數,此時轉換符中的precision表示小數點後的位數,如果未指定precision,則有效位數預設為6Ff類似,但會采用大寫字母。

g表示根據轉換符中的precision(有效位數為0會被視為1)和數值的值來選擇是否使用科學運算質顯示數值,數值末尾無意義的0和小數點會被省略(除非使用#),如果未指定precision,則有效位數預設為6Gg類似,但會采用大寫字母。

c表示將數值轉換為對應的 Unicode 字元。

%表示將轉換符顯示為%自身,而不是取代為某個值。

s表示會呼叫 Python 的str的建構子(建構函式)來格式化轉換符對應的值,r會呼叫 Python 的repr函式,a會呼叫 Python 的ascii函式。

'%d' % 123.456
'123'
'%e' % 1.2345678
'1.234568e+00'
'%.3f' % 1.2345678
'1.235'
'%.0g' % 12345678.9
'1e+07'
'%.3g' % 12345678.9
'1.23e+07'
'%.10g' % 12.0000000001
'12'
'%#.10g' % 12.0000000001
'12.00000000'
'%c' % 65
'A'
'%d%%' % 10
'10%'

使用 Python 舊式 printf 風格格式化 bytes 或 bytearray 物件表示的位元組串

Python 舊式 printf 風格,除了可以格式化 Python 字串,還可以格式化 Pythonbytesbytearray物件表示的位元組串,他們僅在轉換符的type的取值中存在一些差異,具體如下。

b(等價於已取代的s)表示將values提供的值轉換為位元組串,該值需要是一個 Pythonbytesbytearray物件,或遵守緩沖協定的物件,或擁有__bytes__方法的物件。

ar表示將使用運算式repr(obj).encode('ascii','backslashreplace')來轉換values提供的值。

b'%b' % bytearray(b'Jack')
b'Jack'
b'%b' % b'Jack'
b'Jack'
b'%a' % 'Jack,你好'
b"'Jack\\uff0c\\u4f60\\u597d'"
bytearray(b'%a') % b'Jack'
bytearray(b"b\'Jack\'")

在下面的範例中,我們定義了一個用於格式化的 Python 類別Data,該類別定義了方法__bytes__,使其可用於%b表示的格式化。

custom.py
# 一個用於格式化的類別
class Data:
	# 定義了 __bytes__ 方法
	def __bytes__(self):
		return bytes(b'__bytes__')

print(b'%b' % Data())
b'__bytes__'

程式碼

src/zh-hant/data_types/text_types/printf·codebeatme/python·GitHub