从特定专栏写

时间:2014-04-09 09:33:06

标签: python python-3.x formatting

在我的代码中,我有,

 out.write(datGroup)
 out.write(' '*20+": Space Group\n")
 out.write(datLatx +"  ") 
 out.write(datLaty +"  ") 
 out.write(datLatz +"  ") 
 out.write('/'),     
 out.write(' '*20+": a,b,c,alpha,beta,gamma\n")

将输出显示为:

189                    : Space Group
10  11  12  /                    : a,b,c,alpha,beta,gamma

这对我所做的事情是正确的,但不是我想要的。

我想要":Spacegroup"和":a,b,c .."从同一列开始,无论其行的数据在何处结束,如:

189                    : Space Group
10  11  12  /          : a,b,c,alpha,beta,gamma

我可以在python3中执行此操作吗?

在jonrsharpe的例子之后编辑 所以我试过了:

  def write_row(out, data, header, col=20):
    out.write("{0}: {1}".format(" ".join(map(str, data)).ljust(col), header))

  def print_data(self, BSub):
  .....
   with open("Init", mode='w') as out:
     write_row(out, (datGroup,), "Space Group")

给出错误:

$ python3 geninit.py 
Traceback (most recent call last):
  File "geninit.py", line 109, in print_data
    write_row(out, (datGroup,), "Space Group")
NameError: global name 'write_row' is not defined

1 个答案:

答案 0 :(得分:2)

我会创建一个函数来执行此操作,例如:

def print_row(data, header, col=20):
    print("{0}: {1}".format(" ".join(map(str, data)).ljust(col), header))

然后为每个案例调用它:

print_row((datGroup,), "Space Group")
print_row((datLatx, datLaty, datLatz), "a,b,c,alpha,beta,gamma")

这给出了例如

>>> datGroup = 189
>>> datLatx, datLaty, datLatz = 11, 12, 13
>>> print_row((datGroup,), "Space Group")
189                 : Space Group
>>> print_row((datLatx, datLaty, datLatz, "/"), "a,b,c,alpha,beta,gamma")
11 12 13 /          : a,b,c,alpha,beta,gamma

这使用:

  • map(str, ...)将所有data转换为字符串;
  • " ".join(...)data项目之间添加空格;
  • str.ljust用空格填充左侧“列”,保持宽度相同;和
  • str.format将填充的左列和标题放在": "周围。

然后,您可以对此进行调整以写入您的输出文件(您可以将其作为参数传递),而不是print数据,例如:

def write_row(out, data, header, col=20):
    out.write(...)

并致电

write_row(out, (datGroup,), "Space Group")