如何使用Python中的numpy.savetxt对齐不同长度的列?

时间:2013-05-19 07:29:23

标签: python format alignment output

我有几个包含字符串和浮点数作为其元素的列表。

import numpy as num

COLUMN_1 = ['KIC 7742534', 'Variable Star of RR Lyr type' , 'V* V368 Lyr',
        'KIC 7742534', '4.0', '0.4564816']

COLUMN_2 = ['KIC 76', 'Variable Star' , 'V* V33 Lyr',
        'KIC 76', '5.0', '0.45']

DAT = num.column_stack((COLUMN_1, COLUMN_2))
num.savetxt('SAVETXT.txt', DAT, delimiter=' ', fmt='{:^10}'.format('%s'))

运行此文件时得到的输出如下:

KIC 7742534    ,    KIC 76    
Variable Star of RR Lyr type    ,    Variable Star    
V* V368 Lyr    ,    V* V33 Lyr    
KIC 7742534    ,    KIC 76    
4.0    ,    5.0    
0.4564816    ,    0.45     

理想的输出看起来像这样(包括对齐的标题)

#ELEMENT1                            ELEMENT2
KIC 7742534                     ,    KIC 76    
Variable Star of RR Lyr type    ,    Variable Star    
V* V368 Lyr                     ,    V* V33 Lyr    
KIC 7742534                     ,    KIC 76    
4.0                             ,    5.0    
0.4564816                       ,    0.45   

如果字符串没有定义最大宽度,我怎么能得到这样的输出(带有对齐的标题)。我已经尝试修改字符串的格式(fmt),但到目前为止还没有运气。

-Thanks!

1 个答案:

答案 0 :(得分:2)

您需要计算输出最长行的最大字符串长度(或输入取决于您的查看方式),这类似于

的方法
max_len = max(max(map(len,l)) for l in zip(COLUMN_1,COLUMN_2))

会实现。之后,您需要根据max_len的值动态更改fmt参数,您可以这样做:

fmt=('{:^%d}' % max_len).format('%s')

以下非numpy示例显示了预期的输出:

with open('ofile.txt','w+') as f:
    max_len = max(max(map(len,l)) for l in zip(COLUMN_1,COLUMN_2))
    for line in zip(COLUMN_1,COLUMN_2):
        f.write(','.join(('{:<%s}' % (max_len)).format(e) for e in line)+'\n')

生成包含以下内容的文本文件ofile.txt

KIC 7742534                 ,KIC 76                      
Variable Star of RR Lyr type,Variable Star               
V* V368 Lyr                 ,V* V33 Lyr                  
KIC 7742534                 ,KIC 76                      
4.0                         ,5.0                         
0.4564816                   ,0.45