使用python格式化重复的字符串

时间:2018-01-09 03:12:18

标签: python-3.x format

我有一个代码可以生成headersdividerdata作为列表,或者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列的情况下保持解决方案通用等等......

2 个答案:

答案 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