2011-09-23 30 views
3

我有以下的Python 2.x的代碼,其產生一個標題行表格數據:在Python str.format()轉換動態的,很好地格式化表格數據

headers = ['Name', 'Date', 'Age'] 
maxColumnWidth = 20 # this is just a placeholder 
headerRow = "|".join(["%s" % k.center(maxColumnWidth) for k in headers]) 
print(headerRow) 

該代碼輸出如下:

  Name   |  Date  |   Age   

這就是我想要的東西 - 是很好的格式和maxColumnWidth的寬度列中心的數據。 (maxColumnWidth早在程序計算)

the Python docs,你應該能夠做同樣的事情在Python3用大括號字符串格式化,如下所示:

headerRow = "|".join(["{:^maxColumnWidth}".format(k) for k in headers]) 

然而,當我這樣做,我得到如下:

ValueError: Invalid conversion specification 

但是,如果我這樣做:

headerRow = "|".join(["{:^30}".format(k) for k in headers]) 

一切工作正常。 我的問題是:如何在格式字符串而不是整數?:使用一個變量

headerRow = "|".join(["{:^maxColumnWidth}".format(k) for k in headers]) 
+0

「我的問題是:我在這條線上做錯了什麼:」你會得到什麼,你不喜歡? –

+0

@ S.Lott - 編輯爲清晰 –

+0

這是一個非常不同的問題。我無法從原始問題跳轉到這個問題。我很震驚。 「爲了清晰而編輯」是錯誤的。它被修改爲完全不同。 –

回答

4
headers = ['Name', 'Date', 'Age'] 
maxColumnWidth=21 
headerRow = "|".join("{k:^{m}}".format(k=k,m=maxColumnWidth) for k in headers) 
print(headerRow) 

產量

 Name  |  Date  |  Age   
  1. 可以代表寬度maxColumnWidth{m},然後 通過format參數替換該值。
  2. 不需要在join內部使用括號(列表理解)。 A 生成器表達式(不包含括號)就足夠了。
+0

請注意,生成器表達式不需要圍繞它們的括號,只要它們是函數中使用的唯一參數。我認爲對於那些發現生成器的人可能值得注意,這樣他們就不會在其他情況下忽略括號,並想知道爲什麼它不起作用。 – JeromeJ

3

正如它所說的,您的轉換規範是無效的。 「maxColumnWidth」不是有效的轉換規範。

>>> "{:^{maxColumnWidth}}".format('foo', maxColumnWidth=10) 
' foo '