Python3 - 在字符串格式化程序参数中使用变量

时间:2015-02-04 20:18:31

标签: python string printing format

我正在打印一些格式化的列。我想使用以下变量来设置.format参数中的长度

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 = '')

但是这给了我一个无效的字符串格式化程序错误。

我在变量和括号之前尝试了%,但没有运气。

3 个答案:

答案 0 :(得分:7)

你需要:

  1. 也用括号括起名字;和
  2. 将宽度作为关键字参数传递给str.format
  3. 例如:

    >>> 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 :(得分:2)

&#39; d就像这样做

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}'

答案 2 :(得分: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 = ''))