如何相对于(+/-)数字保持分隔符空间的大小?

时间:2017-03-19 02:58:35

标签: python string templates string-formatting

我需要制作包含8个列的小模板,这些列将用空格分隔,如下所示:

预期产出:

3139  3142  3144  3147     1      169.13   0  2000
3144  3147  3165  3167     1      049.2    0  2000
3142  3144  3147  3149     1      065.02   0  2000
3142  3144  3147  3165     1     -168.52   0  2000
3144  3147  3149  3150     1     -172.09   0  2000 
3144  3147  3165  3161     1      171.15   0  2000

但由于第6列中的负值存在,我得到的空格不等,如下所示:

实际输出:

3139  3142  3144  3147     1      169.13   0  2000
3144  3147  3165  3167     1      049.20   0  2000
3142  3144  3147  3149     1      065.02   0  2000
3142  3144  3147  3165     1      -168.52   0  2000
3144  3147  3149  3150     1      -172.09   0  2000
3144  3147  3165  3161     1      171.15   0  2000

所以我的目标是根据我在预期输出中提到的第6列中的+/-值数字来修剪空白区域。

这是我的代码:

from string import Template
import sys

fw=open("sample.txt","w")

DIHRES = ['3139;3142;3144;3147;169.13', '3144;3147;3165;3167;49.20', '3142;3144;3147;3149;65.02',
    '3142;3144;3147;3165;-168.52', '3144;3147;3149;3150;-172.09', '3144;3147;3165;3161;171.15']

for i in DIHRES:
A1 = (i.split(";")[0]).strip()
A2 = (i.split(";")[1]).strip()
A3 = (i.split(";")[2]).strip()
A4 = (i.split(";")[3]).strip()
ANG = (i.split(";")[4]).strip()
str = '''
$A1  $A2  $A3  $A4     1      $ANG   0  2000
        '''
s = Template(str.strip() + "\n")
fw.write(s.substitute(A1=A1, A2=A2, A3=A3, A4=A4, ANG=ANG.rjust(6, '0')))

提前致谢

2 个答案:

答案 0 :(得分:4)

更简单的解决方案是使用format。将最后一项转换为浮点数并使用浮点格式(7宽度,小数后2位)。 0表示前导零,冒号后面的空格表示正数为空格,负数为-

DIHRES = ['3139;3142;3144;3147;169.13',
          '3144;3147;3165;3167;49.20',
          '3142;3144;3147;3149;65.02',
          '3142;3144;3147;3165;-168.52',
          '3144;3147;3149;3150;-172.09',
          '3144;3147;3165;3161;171.15']

for item in DIHRES:
    data = item.split(';')
    data[-1] = float(data[-1])
    print('{}  {}  {}  {}     1      {: 07.2f}   0  2000'.format(*data))
3139  3142  3144  3147     1       169.13   0  2000
3144  3147  3165  3167     1       049.20   0  2000
3142  3144  3147  3149     1       065.02   0  2000
3142  3144  3147  3165     1      -168.52   0  2000
3144  3147  3149  3150     1      -172.09   0  2000
3144  3147  3165  3161     1       171.15   0  2000

答案 1 :(得分:1)

你在ANG中最长的字符串是7个字符

-172.09

并且您试图仅用6

进行辩护
.rjust(6, '0')

只需更改此行:

fw.write(s.substitute(A1=A1, A2=A2, A3=A3, A4=A4, ANG=ANG.rjust(6, '0')))

为:

fw.write(s.substitute(
    A1=A1.rjust(6), A2=A2.rjust(6), A3=A3.rjust(6), 
    A4=A4.rjust(6), ANG=ANG.rjust(8)))

>>>
  3139    3142    3144    3147     1        169.13   0  2000
  3144    3147    3165    3167     1         49.20   0  2000
  3142    3144    3147    3149     1         65.02   0  2000
  3142    3144    3147    3165     1       -168.52   0  2000
  3144    3147    3149    3150     1       -172.09   0  2000
  3144    3147    3165    3161     1        171.15   0  2000

设置列时我喜欢明确证明每个列;所有都是.rjust(6),除了我需要更多和使用的列.rjust(8)

另外,我认为你只想要空格而不是零;所以我删除了你的那部分代码。

更进一步,如果你的输入有这样的数据:

'3144;3147;3165;3167;49.2'

甚至

'3144;3147;3165;3167;49'

而不是:

'3144;3147;3165;3167;49.20'

这可以通过首先将列格式化为包含2个小数位的字符串来解决:

fw.write(s.substitute(A1=A1.rjust(6), A2=A2.rjust(6), 
    A3=A3.rjust(6), A4=A4.rjust(6), 
    ANG=('%.2f' % float(ANG)).rjust(8)))

通过这种方式,无论该列上的输入如何,您都会保持小数点对齐,这是我认为您真正想要的;比“预期的解决方案”更多:

049.2 
Mark Tolonen的.format解决方案也解决了2位十进制浮动问题