【问题标题】:Converting dynamic, nicely formatted tabular data in Python to str.format()将 Python 中的动态、格式良好的表格数据转换为 str.format()
【发布时间】:2011-09-23 21:52:16
【问题描述】:

我有以下 Python 2.x 代码,它为表格数据生成标题行:

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] )

【问题讨论】:

  • “我的问题是:我在这条线上做错了什么:”你有什么不喜欢的?
  • 这是一个非常不同的问题。我无法跟随从原始问题到这个问题的跳跃。我很震惊。 “为清楚起见而编辑”是错误的。它被修改为完全不同。
  • @S.Lott - 那是因为我花了一段时间才弄清楚我真正想要的是什么。

标签: migration python-3.x python


【解决方案1】:
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 中使用方括号(列表理解)。一种 生成器表达式(不带括号)就足够了。

【讨论】:

  • 请注意,仅当生成器表达式是函数中使用的唯一参数时,它们才需要括号。我认为对于那些发现生成器的人来说可能值得注意,这样他们就不会在其他情况下忽略括号并想知道为什么它不起作用。
【解决方案2】:

正如它所说,您的转换规范无效。 “maxColumnWidth”不是有效的转换规范。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多