2015-02-04 71 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