可变 table 宽度与 .format
Variable table width with .format
我正在尝试在文本 table 中显示来自 csv 的数据。我已经到了它显示我需要的一切的地步,但是仍然必须设置 table 宽度,这意味着如果数据比设置的数字长,那么问题就开始了。
我目前打印 table 使用 .format 来整理格式,有没有办法将数据的宽度设置为取决于最长数据长度的变量?
for i in range(len(list_l)):
if i == 0:
print(h_dashes)
print('{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}'.format('|', (list_l[i][0].upper()),'|', (list_l[i][1].upper()),'|',(list_l[i][2].upper()),'|', (list_l[i][3].upper()),'|'))
print(h_dashes)
else:
print('{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}'.format('|', list_l[i][0], '|', list_l[i][1], '|', list_l[i][2],'|', list_l[i][3],'|'))
我意识到代码离完美还很远,但是我还是个新手,所以它是从各种教程中零敲碎打出来的
您实际上可以使用 两次通过 方法首先获得正确的长度。根据每行四个字段的示例,以下显示了您可以使用的基本思想。
下面是两遍方法的示例,首先获取每个字段的最大长度,另一个执行您当前正在做的事情(使用计算长度而不是固定长度):
# Can set MINIMUM lengths here if desired, eg: lengths = [10, 0, 41, 7]
lengths = [0] * 4
fmtstr = None
for pass in range(2):
for i in range(len(list_l)):
if pass == 0:
# First pass sets lengths as per data.
for field in range(4):
lengths[field] = max(lengths[field], len(list_l[i][field])
else:
# Second pass prints the data.
# First, set format string if not yet set.
if fmtstr is None:
fmtstr = '|'
for item in lengths:
fmtstr += '{:^%ds}|' % (item)
# Now print item (and header stuff if first item).
if i == 0: print(h_dashes)
print(fmtstr.format(list_l[i][0].upper(), list_l[i][1].upper(), list_l[i][2].upper(), list_l[i][3].upper()))
if i == 0: print(h_dashes)
格式字符串的构造在您第一次处理第二步中的项目时完成。
它通过像 [31,41,59]
这样的集合并给你字符串来做到这一点:
|{:^31s}|{:^41s}|{:^59s}|
当 |
不是 实际上 一个不同的项目时,使用所有这些 {:^1s}
格式说明符没有什么意义 - 你也可以将它直接编码到格式字符串。
我正在尝试在文本 table 中显示来自 csv 的数据。我已经到了它显示我需要的一切的地步,但是仍然必须设置 table 宽度,这意味着如果数据比设置的数字长,那么问题就开始了。
我目前打印 table 使用 .format 来整理格式,有没有办法将数据的宽度设置为取决于最长数据长度的变量?
for i in range(len(list_l)):
if i == 0:
print(h_dashes)
print('{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}'.format('|', (list_l[i][0].upper()),'|', (list_l[i][1].upper()),'|',(list_l[i][2].upper()),'|', (list_l[i][3].upper()),'|'))
print(h_dashes)
else:
print('{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}{:^26s}{:^1s}'.format('|', list_l[i][0], '|', list_l[i][1], '|', list_l[i][2],'|', list_l[i][3],'|'))
我意识到代码离完美还很远,但是我还是个新手,所以它是从各种教程中零敲碎打出来的
您实际上可以使用 两次通过 方法首先获得正确的长度。根据每行四个字段的示例,以下显示了您可以使用的基本思想。
下面是两遍方法的示例,首先获取每个字段的最大长度,另一个执行您当前正在做的事情(使用计算长度而不是固定长度):
# Can set MINIMUM lengths here if desired, eg: lengths = [10, 0, 41, 7]
lengths = [0] * 4
fmtstr = None
for pass in range(2):
for i in range(len(list_l)):
if pass == 0:
# First pass sets lengths as per data.
for field in range(4):
lengths[field] = max(lengths[field], len(list_l[i][field])
else:
# Second pass prints the data.
# First, set format string if not yet set.
if fmtstr is None:
fmtstr = '|'
for item in lengths:
fmtstr += '{:^%ds}|' % (item)
# Now print item (and header stuff if first item).
if i == 0: print(h_dashes)
print(fmtstr.format(list_l[i][0].upper(), list_l[i][1].upper(), list_l[i][2].upper(), list_l[i][3].upper()))
if i == 0: print(h_dashes)
格式字符串的构造在您第一次处理第二步中的项目时完成。
它通过像 [31,41,59]
这样的集合并给你字符串来做到这一点:
|{:^31s}|{:^41s}|{:^59s}|
当 |
不是 实际上 一个不同的项目时,使用所有这些 {:^1s}
格式说明符没有什么意义 - 你也可以将它直接编码到格式字符串。