Python 學習筆記(6)— 字串格式化

__Light 發表於2019-08-13

字串格式化處理

遠古寫法

以前通常使用運算子號 %%s 插入的值 String 型別,%.3f 指插入的值為包含 3 位小數的浮點數:

format1 = "%s, %s!" % ('Hello', 'World')
# 'Hello, World!'

關鍵字插入法:

temp = string.Template('I am $name, I like $what!;)
temp.substitute(name='Liang', what='Apple')
# 'I am Liang, I like Apple!' 

Python 3 推薦方法

新版本 Python 中,應選擇使用字串方法 format,每個替換欄位都用 {} 大括號(花括號)括起,括號內可留空或新增格式設定資訊:

  • 一般用法:
'I am {},I like {}'.format('Liang', 'Apple')
# 'I am Liang, I like Apple!' 

'I am {0},I like {1}'.format('Liang', 'Apple')
# 'I am Liang, I like Apple!' 
  • 索引也可無需像上面一樣順序排列,但注意不能同時使用自動索引和手工索引
'I am {1},I like {0}'.format('Apple', 'Liang')
# 'I am Liang, I like Apple!' 
  • 更可以像上面關鍵字插入法一樣,給每個替換欄位命名,名稱後面跟冒號可以設定格式:
'{name} is {value:.2f},'.format(name='π', value=pi)
# 'π is 3.14' 
  • 終極簡約寫法,在字串前面加上 f,便可直接將值或變數寫在大括號內:
f"{'π'} is {pi:.2f}"
# 'π is 3.14' 
  • 如果輸出結果中需要包含大括號,則可使用兩個大括號來指定:
"{{我需要使用{what}啊!}}".format(what='大括號')
# {我需要使用大括號啊!}
  • 關鍵字插入法可以和索引同時使用:
'{foo} {1} {bar} {0}'.format(1, 2, foo=3, bar=4)
# '3 1 2 4'

基本轉換

指定佔位符要轉換的型別;

例如,你可以提供一個整數,但將其作為小數進行處理:

num = 1024
f'The number is {num:f}'
# 'The number is 1024.000000'

亦或者將其作為二進位制處理:

num = 1024
f'The number is {num:b}'
# 'The number is 10000000000'

以下為字串格式設定型別說明符:

說明符 含義
b 將整數表示為二進位制
c 將整數解讀為Unicode碼點
d 將整數視為十進位制數進行處理,這是整數預設使用的說明符
e 使用科學表示法來表示小數(用 e 來表示指數)
E 與 e 相同,但使用 E 來表示指數
f 將小數表示為定點數
F 與 f 相同,但與特殊值(nan 和 inf),使用大寫表示
g 自動在定點表示法和科學表示法之間做選擇。這是預設用於小數的說明符,但在預設情況下至少有 1 位小數
G 與 g 相同,但使用大寫來表示指數和特殊值
n 與 g 相同,但插入隨區域而異的數字分隔符
o 將整數表示為八進位制數
s 保持字串的格式不變,這是預設用於字串的說明符
x 將整數表示為十六進位制數並使用小寫字母
X 與 X 相同,但使用大寫字母
% 將數表示為百分比值(乘以100,按說明符 f 的設定格式,再在後面加上 %)

寬度、精度和千位分隔符

在字串格式化處理是,不但可以轉換型別,還可以設定轉換欄位的寬度和精度;

寬度使用整數表示:

num = 1024
f'{num:10}'
# '      1024'

數字和字串的預設對齊方式不同:

num = '1024'
f'{num:10}'
# '1024      '

精度也是使用整數表示,但需要在整數前加上小數點:

num = 1024
f'{num:.2f}'
# '1024.00'

寬度可以和精度同時指定:

num = 1024
f'{num:10.2f}'
# '   1024.00'

字串型別也可以指定精度,但不推薦使用,使用切片處理則更好理解:

str = '今天天氣不錯~'
f'{str:.2}'
# '今天'

在冒號後面新增一個逗號可以為數值新增千位分隔符:

num = 10000000000000
f'{num:,}'
# '10,000,000,000,000'

填充、對齊與符號

在不新增對齊符號(使用預設對齊方式)的情況下,儘可以使用 0 進行有意義的填充操作:

num = 1024
f'{num:010}'
# '0000001024'

但是在新增了對齊符號之後,就可以在對齊符號前面任意新增一個字元表示填充字元了;

對齊符號:<(左對齊)、>(右對齊)、^(居中),寫在寬度之前:

num = 1024
f'{num:<10}'
'1024      '
f'{num:^10}'
'   1024   '
f'{num:>10}'
'      1024'

當替換欄位為數值時,可為替換欄位新增正負符號,

新增 + 符號時,加號寫在對齊符號之後,寬度整數之前;

新增 - 符號時,減號寫在替換欄位的之前;

可以理解為將替換欄位的數值乘以 +1(將 + 顯示)或 -1

num = 1024
f'{num:>+10}'
'     +1024'
f'{-num:>10}'
'     -1024'

如果需要為負數新增符號:

num = -1024
f'{num:>10}'
'     -1024'
f'{-num:>+10}'
'     +1024'

= 是一種新增了正負符號之後的另一種對齊符號(可以理解為 兩端對齊),作用是將填充字元放在符號和數字之間:

num = 1024
f'{num:=+10}'
'+     1024'
f'{-num:=10}'
'-     1024'

總結

'{[0]sum[1][2][3][4][5]}'

0:為替換欄位新增 - 符號(替換欄位須為數字且不為負數,因為負數無需再多此一舉);

1:為替換欄位指定寬度之後可以在此位置指定填充字元,預設為空格;

2:為替換欄位指定寬度之後可以在此位置指定對齊符號,<(左對齊) / ^(居中) / >(右對齊) / =(兩端對齊,只能用於型別為數值切有正負符號的替換欄位);

3:為替換欄位新增 + 符號(替換欄位須為數字);

4:指定替換欄位的寬度,只能填寫整數;

5:指定替換欄位的精度或轉換型別;