我正在尝试在文本表中显示来自CSV的数据。我已经到了可以显示我需要的所有内容的地步,但是仍然必须设置表的宽度,这意味着如果数据长于设置的数字,那么问题就会开始。
我目前使用.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],'|'))
我意识到代码还很完美,但我仍然是一个新手,因此在各种教程中都是零碎的
答案 0 :(得分:0)
您实际上可以使用两次通过方法来首先获得正确的长度。按照您的示例(每行四个字段),以下显示了您可以使用的基本概念。
下面是两次遍历方法的示例,首先获取每个字段的最大长度,另一个获取当前正在执行的操作(使用计算出的长度而不是固定的长度):
# 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}
实际上不是变化项时,使用所有这些|
格式说明符没什么意义-您也可以将其直接编码为格式字符串。 / p>