2015-02-04 46 views
1

我有一些格式化的列正在打印。我想用以下變量設置長度在我.format參數Python3 - 在字符串格式器參數中使用變量

number_length = 5 
name_length = 24 
viewers_length = 9 

print('{0:<5}{1:<24}{2:<9}'.format(' #','channel','viewers'), end = '') 

我非常希望像

print('{0:<number_length}{1:<name_length}{2:<viewers_length}'.format(
    ' #','channel','viewers'), end = '') 

但是這給了我無效的字符串格式化程序錯誤。

我已經嘗試過%之前的變量和括號,但沒有運氣。

+0

你可以分享所需的輸出將會? – Jkdc

回答

5

您需要:

  1. 裹在括號中的名字,太;和
  2. 將寬度作爲關鍵字參數傳遞給str.format

例如:

>>> print("{0:>{number_length}}".format(1, number_length=8)) 
     1 

您還可以使用字典拆包:

>>> widths = {'number_length': 8} 
>>> print("{0:>{number_length}}".format(1, **widths)) 
     1 

str.format不會看在局部範圍內進行適當的名稱;他們必須明確通過。

對於你的榜樣,這可能是工作,如:

>>> widths = {'number_length': 5, 
       'name_length': 24, 
       'viewers_length': 9} 
>>> template= '{0:<{number_length}}{1:<{name_length}}{2:<{viewers_length}}' 
>>> print(template.format('#', 'channel', 'visitors', end='', **widths)) 
# channel     visitors 

(需要注意的是end,以及任何其他明確的關鍵字參數,一定要來**widths前)

1

你可以建立格式字符串第一

f = '{0:<%d}{1:<%d}{2:<%d}' % (number_length, name_length, viewers_length) 
#produces 
'{0:<5}{1:<24}{2:<9}' 

然後使用你的其他格式的呼叫

print(f.format(' #','channel','viewers'), end = '')) 
+0

混合兩種不同的字符串格式風格似乎很奇怪! – jonrsharpe

+0

完美,謝謝。不知道你能做到這一點。我也喜歡這個,因爲我不止一次地使用這種格式,所以建立一個單一的時間是可取的。 –

2

我會做這樣的

In [11]: widths = dict(number=5, name=24, viewers=9) 

In [12]: data = ('#', 'channel', 'viewers') 

In [13]: '{:<{number}}{:<{name}}{:<{viewers}}'.format(*data, **widths) 
Out[13]: '# channel     viewers ' 

當然,也可以生成格式字符串,但實際上並未將其格式化:

In [14]: '{{:<{number}}}{{:<{name}}}{{:<{viewers}}}'.format(**widths) 
Out[14]: '{:<5}{:<24}{:<9}' 
+0

雙括號的額外步驟可能是多餘的;您可以嵌套單個大括號,並將寬度和值同時傳遞給格式。 – jonrsharpe

+0

@jonrsharpe是的,謝謝,編輯我的答案 – vaultah