用Python编写文件

时间:2014-09-25 20:53:14

标签: python

有一种名为.xyz的文件格式有助于可视化分子键。基本上格式要求特定模式:

在第一行必须有原子数,在我的情况下是30。 之后应该有数据,其中第一行是原子的名称,在我的例子中,它们都是碳。第二行是x信息,第三行是y信息,最后一行是z信息,在我的情况下都是0。所以像这样:

30 C x1 y1 z1 C x2 y2 z2 ... ... ...

我用C ++生成我的数据到这样的文本文件中:

C       2.99996     7.31001e-05     0
C       2.93478     0.623697        0
C       2.74092     1.22011     0
C       2.42702     1.76343     0
C       2.0079      2.22961     0
C       1.50006     2.59812     0
C       0.927076        2.8532      0
C       0.313848        2.98349     0
C       -0.313623       2.9837      0
C       -0.927229       2.85319     0
C       -1.5003     2.5981      0
C       -2.00732        2.22951     0
C       -2.42686        1.76331     0
C       -2.74119        1.22029     0
C       -2.93437        0.623802        0
C       -2.99992        -5.5509e-05     0
C       -2.93416        -0.623574       0
C       -2.7409     -1.22022        0
C       -2.42726        -1.7634     0
C       -2.00723        -2.22941        0
C       -1.49985        -2.59809        0
C       -0.92683        -2.85314        0
C       -0.313899       -2.98358        0
C       0.31363     -2.98356        0
C       0.927096        -2.85308        0
C       1.50005     -2.59792        0
C       2.00734     -2.22953        0
C       2.4273      -1.76339        0
C       2.74031     -1.22035        0
C       2.93441     -0.623647       0

所以,现在我要做的就是我想把这个文件写成.xyz文件。我在网上看到人们用Python做的,我几乎没有经验。所以我查了一下并想出了这个脚本:

#!/usr/bin/env/python
text_file = open("output.txt","r")
lines = text_file.readlines()
myfile = open("output.xyz","w")
for line in lines:
     atom, x, y, z = line.split()
     myfile.write("%s\t %d\t %d\t %d\t" %(atom,x,y,z))
myfile.close()
text_file.close()

然而,当我运行它时,它会出现以下错误:"%d格式:需要一个数字,而不是str。"

对我来说没有意义,因为正如你在txt文件中看到的那样,它们都是与第一行不同的数字。我尝试将我的d更改为s,但之后程序我将这些数据加载到错误中。

总结一下: 我在.txt中有一个数据文件,我想将其更改为.xyz已被指定,但我遇到了问题。

提前致谢。

2 个答案:

答案 0 :(得分:2)

字符串也可以表示数字。在编程语言中,这称为类型。 '1'1有不同的类型。使用%s代替字符串。

myfile.write("%s\t %s\t %s\t %s\t" % (atom, x, y, z))

如果您希望它们是浮点数,您应该在解析阶段执行此操作:

x, y, z = map(float, (x, y, z))

顺便说一下,%在python中被认为是过时的。请改用格式:

myfile.write("{}\t {}\t {}\t {}\t".format(atom,x,y,z))

答案 1 :(得分:0)

也许您遇到的问题是由于答案(标签)中的“ \ t”引起的。

.xyz文件仅使用空格将数据与同一行分开,如here所述。如果需要,可以只使用一个空格,但要具有易于读取的格式,就像其他程序在保存.xyz文件时使用的格式一样,最好使用https://pyformat.info/

中的提示

我的工作代码(在Python 3中)使用CSD Python API库中的分子和原子对象生成.xyz文件,您可以根据自己的实际情况进行调整。

with open("file.xyz", 'w') as xyz_file:
    xyz_file.write("%d\n%s\n" % (len(molecule.atoms), title))
    for atom in molecule.atoms:
        xyz_file.write("{:4} {:11.6f} {:11.6f} {:11.6f}\n".format(
            atom.atomic_symbol, atom.coordinates.x, atom.coordinates.y, atom.coordinates.z))

前两行是原子数和xyz文件的标题。其他几行是原子(原子符号和3D位置)。

因此,原子符号具有4个空格,并向左对齐:{:4}

然后,发生3次: {:11.6f}

这意味着一个空格后接下一个坐标,该空格使用向右对齐的11个字符,其中6个在小数点后。对于-999.999999到9999.999999之间的数字就足够了,这些数字就足够了。超出此间隔的数字只会破坏格式,但会在数据之间保留必填的空间,因此xyz文件在这些情况下仍然有效。

结果是这样的:

18
WERPOY
N       0.655321    3.658330   14.594159
C       1.174111    4.551873   13.561374
C       0.703656    3.889113   15.926147
S       1.455530    5.313258   16.574524
C       1.127601    5.061435   18.321297
N       0.146377    2.914698   16.639984
C      -0.288067    2.014580   15.736297
C       0.014111    2.441298   14.475693
N      -0.266880    1.787085   13.260652
O      -0.831165    0.699580   13.319885
O       0.056329    2.322290   12.209641
H       0.439235    4.780025   12.970561
H       1.821597    4.148825   13.137629
H       1.519448    5.312600   13.775525
H       1.522843    5.786000   18.590124
H       0.171557    5.069325   18.423056
H       1.477689    4.168550   18.574936
H      -0.665073    1.282125   16.053727