我有一个代码可以生成headers
,divider
和data
作为列表,或者data
作为列表列表。在我展示的示例中,每个列表中都有4个字符串;但是,这可能因运行而异。我想以列式格式将数据写入命令提示符,但是遇到了问题。我的代码示例如下所示。
headers = ['id', 'Date', 'Column1', 'Column2']
dividers = ['-' * len(headers) for i in range(len(headers))]
data = [['1', '2017-01-18', '7.71320643266746', 'Gas'],
['2', '2017-01-13', '0.207519493594015', 'Groceries',
['3', '2017-01-18', '6.336482349262754', 'Groceries']
我正在尝试使用以下格式打印数据;
fmat = '{15s}' * len(headers)
print(fmat.format(*headers))
print(fmat.format(*dividers))
for i in range(len(data)):
print(fmat.format(*data[i))
虽然不在编码中,但我还希望在每个列之间有一个空格填充,每个列不应超过15列。换句话说,我希望输出看起来像这样;
id Date Column2 Column3
-- ---- ------- -------
1 2017-01-18 7.7132064326674 Gas
2 2017-01-13 0.2075194935940 Groceries
3 2017-01-18 6.3364823492627 Groceries
不幸的是输出看起来像这样;
id Date Column2 Column3
-- ---- ------- -------
1 2017-01-18 7.71320643266746Gas
2 2017-01-13 0.207519493594015Groceries
3 2017-01-18 6.336482349262754Groceries
正如您所看到的,Column2
并未以15个字符结尾,而是溢出到Column3
。如何格式化此问题以使列停止在15并且还允许每列之间填充1个字符?我试图在有8列或3列的情况下保持解决方案通用等等......
答案 0 :(得分:2)
您可以这样使用格式:
headers = ['id', 'Date', 'Column1', 'Column2']
dividers = ['-' * len(headers) for i in range(len(headers))]
data = [['1', '2017-01-18', '7.71320643266746', 'Gas'],
['2', '2017-01-13', '0.207519493594015', 'Groceries'],
['3', '2017-01-18', '6.336482349262754', 'Groceries']]
row_format ="{:<20}" * (len(headers))
print (row_format.format(*headers))
print (row_format.format(*dividers))
for row in data:
print (row_format.format(*row))
答案 1 :(得分:1)
你的代码告诉我一个有一些拼写错误的循环并且没有达到预期的结果,但我想我已经弄明白了。
@ Gordon的解决方案应该对您有用,但是如果您想要保持原始代码的精神,fmat
行应该更改为:
fmat = '{:15.15} ' * len(headers)
快速谷歌搜索通过.format
向我发送了here on how to combine truncating and padding。简而言之,:15
表示至少填充15个空格,而.15
表示最多截断为15个字符。
您可能还想将dividers
行更新为:
dividers = ['-' * len(i) for i in headers]
您展示的代码仅返回---
4次,而不是-
与列长相匹配。
结果是:
id Date Column1 Column2
-- ---- ------- -------
1 2017-01-18 7.7132064326674 Gas
2 2017-01-13 0.2075194935940 Groceries
3 2017-01-18 6.3364823492627 Groceries