Python 3.x 用python格式化重复字符串

Python 3.x 用python格式化重复字符串,python-3.x,format,Python 3.x,Format,我有一个代码,可以将标题、分隔符和数据作为列表,或者在数据作为列表的情况下。在我展示的示例中,每个列表中有4个字符串;但是,这可能因运行而异。我想以列格式将数据写入命令提示符,但遇到问题。下面是我的代码示例 headers = ['id', 'Date', 'Column1', 'Column2'] dividers = ['-' * len(headers) for i in range(len(headers))] data = [['1', '2017-01-18', '7.7132064

我有一个代码,可以将
标题
分隔符
数据
作为列表,或者在
数据
作为列表的情况下。在我展示的示例中,每个列表中有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   
不幸的是,输出是这样的

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列等情况的通用解决方案。

您可以通过以下方式使用格式:

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))
headers=['id','Date','Column1','Column2']
除数=['-'*len(标题)表示范围内的i(len(标题))]
数据=['1','2017-01-18','7.71320643266746','Gas'],
[2',2017-01-13',0.207519493594015','Groceries'],
['3','2017-01-18','6.336482349262754','Groceries']

row_format=“{:您可以通过以下方式使用格式:

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))
headers=['id','Date','Column1','Column2']
除数=['-'*len(标题)表示范围内的i(len(标题))]
数据=['1','2017-01-18','7.71320643266746','Gas'],
[2',2017-01-13',0.207519493594015','Groceries'],
['3','2017-01-18','6.336482349262754','Groceries']

row_format=“{:您的代码让我陷入了一个循环,有一些输入错误,与预期结果不匹配,但我想我已经找到了答案

@Gordon的解决方案应该适合您,但如果您想保持原始代码的精神,则应将
fmat
行更改为:

fmat = '{:15.15} ' * len(headers)
快速的谷歌搜索让我找到了
.format
。简言之,
:15
表示至少填充15个空格,而
.15
表示最多截断15个字符

您可能还希望将
分隔符
行更新为以下内容:

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   

你的代码让我陷入了一个循环,有一些拼写错误,与预期的结果不匹配,但我想我找到了答案

@Gordon的解决方案应该适合您,但如果您想保持原始代码的精神,则应将
fmat
行更改为:

fmat = '{:15.15} ' * len(headers)
快速的谷歌搜索让我找到了
.format
。简言之,
:15
表示至少填充15个空格,而
.15
表示最多截断15个字符

您可能还希望将
分隔符
行更新为以下内容:

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   

不幸的是,这种方法假设事先知道需要格式化多少列。在本例中,我有4列,但函数可以允许将任意数量的列输入函数,并且代码必须足够智能,以便知道如何为每种情况格式化输出。此解决方案并不比我使用的解决方案好rst.如果我将长度缩小到15,那么Column1仍然占据超过15列,当我指定
new\u行时,它不应该这样做={:忽略我之前的评论,我看到你对你的回复做了更改。我认为现在效果很好。谢谢你的指导。实际上我收回了我以前的评论。这个解决方案仍然会导致第3列超过15列。如果我转到20列,就有空间,但尽管如此,我需要该列停在15列,并且仍然有一个spac每个列之间都有一个字符串。@Jon是的,没关系。虽然我没有详细阅读你的问题,但我只是写了一些代码来说明你可以用这种方式使用字符串格式。:)不幸的是,这种方式假设事先知道需要格式化多少列。在这种情况下,我有4列,但函数可以允许任何数字要输入函数的列的数量,代码必须足够聪明,知道如何为每种情况设置输出格式。此解决方案并不比我首先使用的解决方案好。如果我将长度缩小到15,则Column1仍会占用超过15列,这在我指定
new\u行时是不应该的={:忽略我之前的评论,我看到你对你的回复做了更改。我认为现在效果很好。谢谢你的指导。实际上我收回了我以前的评论。这个解决方案仍然会导致第3列超过15列。如果我转到20列,就有空间,但尽管如此,我需要该列停在15列,并且仍然有一个spac每列之间都有一个字符串。@Jon是的,没关系。虽然我没有详细阅读你的问题,但我只是写了一些代码来说明你可以用这种方式使用字符串格式。:)