python format


Basic formatting

  最常見的是按照位置進行format,平常用在參數的順序不太可能更改,並且需要用到的format比較少情況。

  按照位置進行format的缺點是:元素沒有用像名稱之類的具有描述性的東西來表示,所以這種 format 只適用於格式化相對較少的元素的情況。

''' format字符串 '''
# 舊樣式
'%s %s' % ('one', 'two') # one two
# 新樣式
'{} {}'.format('one', 'two') # one two
Output

''' format數字'''
# 舊樣式
'%d %d' % (1, 2) # 1 2
# 新樣式
'{} {}'.format(1, 2) # 1 2
Output

'''
    還有一種新的format格式,可以給占位符一個顯式的位置索引。(在Python2.6中甚至是強制的)
    這樣可以在不更改參數的情況下重新排列顯示順序。不過這個format不能用於舊版本。
'''
# 新樣式
'{1} {0}'.format('one', 'two') # two one

 

Value conversion

  默認情況下,新樣式的簡單格式化程序是調用對象的__format__()方法。如果只想呈現str(…)或repr(…)的輸出,可以使用 !s 或 !r 進行標識。

  在%樣式中,通常使用%s表示字符串,%r表示repr(…)轉換。

class Data(object):

    def __str__(self):
        return 'str'

    def __repr__(self):
        return 'repr'
構造
# 舊樣式
'%s %r' % (Data(), Data()) # str repr
# 新樣式
'{0!s} {0!r}'.format(Data()) # str repr

 

  Python 3 中存在一個使用repr(…)輸出但使用ascii(…)的附加轉換標志。

class Data(object):

    def __repr__(self):
        return 'räpr'
構造
# 舊樣式
'%r %a' % (Data(), Data()) # räpr r\xe4pr
# 新樣式
'{0!r} {0!a}'.format(Data()) # räpr r\xe4pr

 

填充和對齊字符串

  默認情況下,值的格式設置為只占用表示內容所需的字符數。但是,也可以定義一個值所需填充到的一個特定的長度。 

  不過,新樣式和舊樣式格式的默認對齊方式不同。舊樣式默認為右對齊,而新樣式默認為左對齊。

'''右對齊'''
# 舊樣式
'%10s' % ('test',) #       test
# 新樣式
'{:>10}'.format('test') #       test
Output

'''左對齊'''
# 舊樣式
'%-10s' % ('test',) # test  
# 新樣式
'{:10}'.format('test') # test  

 

  另外,新樣式format比起舊樣式,多了可以使用指定字符填充、居中填充等功能

# 使用指定字符填充
'{:_<10}'.format('test') # test______
# 居中填充
'{:_^10}'.format('test') # ___test___
# 當使用居中填充時,如果字符串長度導致填充字符兩端長度不同,則多的字符將放置在右側:
'{:_^6}'.format('zip')# _zip__

 

截取長字符串

  與填充相反,也可以將過長的字符串截斷為特定數量的字符。

# 舊樣式
'%.5s' % ('xylophone') # xylop
# 新樣式
'{:.5}'.format('xylophone') # xylop

 

截斷和填充相結合

# 舊樣式
'%-10.5s' % ('xylophone') # xylop   
# 新樣式
'{:_<10.5}'.format('xylophone') # xylop_____
 

format數字

'''整型'''
# 舊樣式
'%d' % (42) # 42
# 新樣式
'{:d}'.format(42) # 42
Output

'''浮點型'''
# 舊樣式
'%f' % (3.141592653589793) # 3.141593
# 新樣式
'{:f}'.format(3.141592653589793) # 3.141593

 

數字的填充和截斷

# 舊樣式
'%4d' % (42,) #   42
# 新樣式
'{:4d}'.format(42) #   42

# 同樣類似於截斷字符串,浮點數的精度限制小數點后的位置數。
# 對於浮點,填充值表示完整輸出的長度。
#在下面的示例中,我們希望輸出至少有6個字符,小數點后有2個字符。

# 舊樣式
'%06.2f' % (3.141592653589793,) # 003.14
# 新樣式
'{:06.2f}'.format(3.141592653589793) # 003.14
Output

# 對於提供精度的整數值來說,沒有多大意義,實際上在新樣式中是禁止的(它將導致valueerror)。
# 舊樣式
'%04d' % (42,) # 0042
# 新樣式
'{:04d}'.format(42) # 0042

 

給數字加符號

  默認情況下,只有負數的前綴有符號,不過我們也可以把正數的加上。

# 舊樣式
'%+d' % (42) # +42
# 新樣式
'{:+d}'.format(42) # +42

'''使用空格字符表示負數應以減號作為前綴,正數應使用前導空格'''
# 舊樣式
'% d' % ((- 23)) # -23
'% d' % (42) #  42
# 新樣式
'{: d}'.format((- 23)) # -23
'{: d}'.format(42) #  42

'''新樣式格式還可以控制符號相對於填充的位置。此操作不能用於舊樣式格式'''
# 新樣式
'{:=5d}'.format((- 23)) # -  23
'{:=+5d}'.format(23) # +  23

 

命名占位符

  占位符支持命名,這樣就可以參數的傳遞就可以多樣化,既可以是字典的形式也可以是鍵值對的形式

# 傳遞的參數
data = {'first': 'hello', 'last': 'world!'}

# 舊樣式
'%(first)s %(last)s' % data # hello world!
# 新樣式
'{first} {last}'.format(**data) # hello world!

# 新版本
'{first} {last}'.format(first='hello', last='world!') # hello world!

 

Getitem 和 Getattr

此操作不能用於舊樣式格式。

  新的樣式格式允許在訪問嵌套數據結構時具有更大的靈活性。它支持訪問支持類似“getitem”的容器,例如字典和列表:

# 傳遞的參數
person = {'first': 'Jean-Luc', 'last': 'Picard'}
# 新樣式
'{p[first]} {p[last]}'.format(p=person) # Jean-Luc Picard

# 傳遞的參數
data = [4, 8, 15, 16, 23, 42]
# 新樣式
'{d[4]} {d[5]}'.format(d=data) # 23 42

'''通過getAttr()訪問對象上的屬性'''
class Plant(object):
    type = 'tree'
# 新樣式
'{p.type}'.format(p=Plant()) # tree

'''以上兩種類型可以自由混合和任意嵌套'''
class Plant(object):
    type = 'tree'
    kinds = [{'name': 'oak'}, {'name': 'maple'}]
# 新樣式
'{p.type}: {p.kinds[0][name]}'.format(p=Plant()) # tree: oak

 

Datetime

此操作不能用於舊樣式格式。

  新樣式格式還允許對象控制自己的渲染。例如,允許以內聯方式格式化日期時間對象:

from datetime import datetime
# 新樣式
'{:%Y-%m-%d %H:%M}'.format(datetime(2001, 2, 3, 4, 5)) # 2001-02-03 04:05

 

參數化formats

  新樣式format允許使用參數化動態指定格式的所有組件。參數化格式是大括號中的嵌套表達式,可以出現在冒號后面的父格式中的任何位置。

  舊樣式的格式也支持一些參數化,但更為有限。也就是說,它只允許對輸出的寬度和精度進行參數化。

 

'''對齊和長度參數化 '''
# 不支持舊樣式
# 新樣式
'{:{align}{width}}'.format('test', align='^', width='10') #    test   

'''精度參數化'''
# 舊樣式
'%.*s = %.*f' % (3, 'Gibberish', 3, 2.7182) # Gib = 2.718
# 新樣式
'{:.{prec}} = {:.{prec}f}'.format('Gibberish', 2.7182, prec=3) # Gib = 2.718

'''長度和精度參數化'''
# 舊樣式
'%*.*f' % (5, 2, 2.7182) #  2.72
# 新樣式
'{:{width}.{prec}f}'.format(2.7182, width=5, prec=2) #  2.72

'''嵌套format可用於替換format的任何部分,因此上面的精度示例可重寫為'''
# 不支持舊樣式
# 新樣式
'{:{prec}} = {:{prec}}'.format('Gibberish', 2.7182, prec='.3') # Gib = 2.72

'''日期時間的組成部分可以單獨設置'''
# 不支持舊樣式
from datetime import datetime
dt = datetime(2001, 2, 3, 4, 5)
# 新樣式
'{:{dfmt} {tfmt}}'.format(dt, dfmt='%Y-%m-%d', tfmt='%H:%M') # 2001-02-03 04:05

'''嵌套formats可以是位置參數。位置取決於大括號的順序'''
# 不支持舊樣式
# 新樣式
'{:{}{}{}.{}}'.format(2.7182818284, '>', '+', 10, 3) #      +2.72

'''關鍵字參數可以添加到組合中'''
# 不支持舊樣式
# 新樣式
'{:{}{sign}{}.{}}'.format(2.7182818284, '>', 10, 3, sign='+') #      +2.72

 

 

自定義對象

此操作不能用於舊樣式格式。

  datetime示例通過使用__format__()方法工作。通過重寫此方法,可以在自己的對象中定義自定義格式處理。就可以完全控制所使用的格式語法。

 

class HAL9000(object):
    def __format__(self, format):
        if (format == 'open-the-pod-bay-doors'):
            return "I'm afraid I can't do that."
        return 'HAL 9000'
# 新樣式
'{:open-the-pod-bay-doors}'.format(HAL9000()) # I'm afraid I can't do that.

 

 

 

           


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM