首頁>技術>

2.3 格式化

雖然本節稍微有點離題,但是當處理資料時,通常想要生成結構化的輸出(如表格)。示例:

      Name      Shares        Price----------  ----------  -----------        AA         100        32.20       IBM          50        91.10       CAT         150        83.44      MSFT         200        51.23        GE          95        40.37      MSFT          50        65.10       IBM         100        70.44
字串格式化

在 Python 3.6+ 中,格式化字串的一種方法是使用 f-strings:

>>> name = 'IBM'>>> shares = 100>>> price = 91.1>>> f'{name:>10s} {shares:>10d} {price:>10.2f}''       IBM        100      91.10'>>>

{expression:format} 部分會被取代。

f-strings 通常和 print() 函式一起使用:

print(f'{name:>10s} {shares:>10d} {price:>10.2f}')
格式碼

格式碼(在 {} 內 : 之後)與 C 語言的 printf() 函式類似。常見格式碼包括:

d       Decimal integerb       Binary integerx       Hexadecimal integerf       Float as [-]m.dddddde       Float as [-]m.dddddde+-xxg       Float, but selective use of E notations       Stringc       Character (from integer)

常見的修飾符可調整欄位寬度和數的精度。這是部分內容:

:>10d   Integer right aligned in 10-character field:<10d   Integer left aligned in 10-character field:^10d   Integer centered in 10-character field:0.2f   Float with 2 digit precision
字典格式化

可以使用字串的 format_map() 方法將字串格式化應用於值的字典:

>>> s = {    'name': 'IBM',    'shares': 100,    'price': 91.1}>>> '{name:>10s} {shares:10d} {price:10.2f}'.format_map(s)'       IBM        100      91.10'>>>

雖然 format_map() 和 f-strings 使用相同的格式碼,但是是從提供的字典中獲取值。

format()方法

有一個 format() 方法可以將格式化應用於引數或者關鍵字引數:

>>> '{name:>10s} {shares:10d} {price:10.2f}'.format(name='IBM', shares=100, price=91.1)'       IBM        100      91.10'>>> '{:10s} {:10d} {:10.2f}'.format('IBM', 100, 91.1)'       IBM        100      91.10'>>>

坦白說,format() 方法稍微有點冗長,我更傾向於使用 f-strings。

C 風格的格式化

也可以使用格式化運算子 % :

>>> 'The value is %d' % 3'The value is 3'>>> '%5d %-5d %10d' % (3,4,5)'    3 4              5'>>> '%0.2f' % (3.1415926,)'3.14'

這要求右邊是一個單項或者元組,格式碼也是模仿 C 語言 printf() 函式的。

注意:這是位元組字串上唯一可用的格式化方法。

>>> b'%s has %n messages' % (b'Dave', 37)b'Dave has 37 messages'>>>
練習練習 2.8:如何格式化數字

列印數字常見的一個問題就是指定數字的小數位數。其中的一種解決方法就是使用 f-strings。請嘗試以下示例:

>>> value = 42863.1>>> print(value)42863.1>>> print(f'{value:0.4f}')42863.1000>>> print(f'{value:>16.2f}')        42863.10>>> print(f'{value:<16.2f}')42863.10>>> print(f'{value:*>16,.2f}')*******42,863.10>>>

有關 f-strings 使用的格式碼的完整文件在 這裡 可以找到。有時,也使用字串運算子 % 執行格式化。

>>> print('%0.4f' % value)42863.1000>>> print('%16.2f' % value)        42863.10>>>

與運算子 % 使用的各種格式碼有關的文件可以在 這裡 找到。儘管它通常與 print() 函式一起使用,但是字串格式化與列印無關。如果要儲存格式化的字串,把它賦值給變數即可。

>>> f = '%0.4f' % value>>> f'42863.1000'>>>
練習 2.9:收集資料

在練習 2.7 中,編寫了一個用於計算股票投資盈虧的程式 report.py。在本練習中,需要修改這個程式來生成如下表格:

      Name     Shares      Price     Change---------- ---------- ---------- ----------        AA        100       9.22     -22.98       IBM         50     106.28      15.18       CAT        150      35.46     -47.98      MSFT        200      20.89     -30.34        GE         95      13.48     -26.89      MSFT         50      20.89     -44.21       IBM        100     106.28      35.84

在此表格中,"Price" 是當前股價,"Change" 是當前股價與原始購買股價的差。

為了生成上述表格,首先需要收集表中展示的所有資料。編寫 make_report() 函式,以股票列表和價格字典作為輸入,並返回一個包含上表中所有行的元組列表。

把 make_report() 函式新增到 report.py 檔案中。如果互動式地執行該函式,則應該按以下步驟進行:

>>> portfolio = read_portfolio('Data/portfolio.csv')>>> prices = read_prices('Data/prices.csv')>>> report = make_report(portfolio, prices)>>> for r in report:        print(r)('AA', 100, 9.22, -22.980000000000004)('IBM', 50, 106.28, 15.180000000000007)('CAT', 150, 35.46, -47.98)('MSFT', 200, 20.89, -30.339999999999996)('GE', 95, 13.48, -26.889999999999997)...>>>
練習 2.10:列印格式化的表格

重做練習 2.9 中的 for 迴圈,但是請更改列印語句以格式化元祖。

>>> for r in report:        print('%10s %10d %10.2f %10.2f' % r)          AA        100       9.22     -22.98         IBM         50     106.28      15.18         CAT        150      35.46     -47.98        MSFT        200      20.89     -30.34...>>>

也可以使用 f-strings 擴充套件值。例如:

>>> for name, shares, price, change in report:        print(f'{name:>10s} {shares:>10d} {price:>10.2f} {change:>10.2f}')          AA        100       9.22     -22.98         IBM         50     106.28      15.18         CAT        150      35.46     -47.98        MSFT        200      20.89     -30.34...>>>

把上面的語句新增到 report.py 程式中,讓程式獲取make_report() 的輸出,並列印如列印如上圖所示的格式化的表。

練習 2.11:新增標題

假定有一個像下面這樣的標題名稱元組:

headers = ('Name', 'Shares', 'Price', 'Change')

把上面的標題元組程式碼新增到程式中,並且建立一個字串,每個標題向右對齊並且寬度是10,每個欄位使用單個空格分隔。

'      Name     Shares      Price      Change'

編寫在標題和資料之間建立分隔字串的程式碼。分隔字串指每個欄位名下的一串下劃線("-")字元。例如:

'---------- ---------- ---------- -----------'

當完成後,程式應生成本節頂部所示的表。

      Name     Shares      Price     Change---------- ---------- ---------- ----------        AA        100       9.22     -22.98       IBM         50     106.28      15.18       CAT        150      35.46     -47.98      MSFT        200      20.89     -30.34        GE         95      13.48     -26.89      MSFT         50      20.89     -44.21       IBM        100     106.28      35.84
練習 2.12:格式化挑戰

如何修改程式碼使得價格包括貨幣符號($),並且像下面這樣輸出:

      Name     Shares      Price     Change---------- ---------- ---------- ----------        AA        100      $9.22     -22.98       IBM         50    $106.28      15.18       CAT        150     $35.46     -47.98      MSFT        200     $20.89     -30.34        GE         95     $13.48     -26.89      MSFT         50     $20.89     -44.21       IBM        100    $106.28      35.84

6
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 小問題大隱患:如何正確設定 Python 專案的入口檔案?