有一种名为.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已被指定,但我遇到了问题。
提前致谢。
答案 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