我有一个file.txt
形式:
; In this topology include file, you will find position restraint
; entries for all the heavy atoms in your original pdb file.
; This means that all the protons which were added by pdb2gmx are
; not restrained.
[ position_restraints ]
; atom type fx fy fz
1 1 1000 1000 1000
5 1 1000 1000 1000
7 1 1000 1000 1000
10 1 1000 1000 1000
12 1 1000 1000 1000
13 1 1000 1000 1000
14 1 1000 1000 1000
16 1 1000 1000 1000
(如果您感兴趣,这是来自gromacs)的位置限制文件
在Python中,我有一个numpy.array的整数[2, 4, 7, 8, 9, 10, 15, 108]
。我想将file.txt
替换为:
; In this topology include file, you will find position restraint
; entries for all the heavy atoms in your original pdb file.
; This means that all the protons which were added by pdb2gmx are
; not restrained.
[ position_restraints ]
; atom type fx fy fz
2 1 1000 1000 1000
4 1 1000 1000 1000
7 1 1000 1000 1000
8 1 1000 1000 1000
9 1 1000 1000 1000
10 1 1000 1000 1000
15 1 1000 1000 1000
108 1 1000 1000 1000
也就是说,file.txt
中的表的第一列将被我在Python中定义的整数数组所取代。请注意如何遵守列中的对齐方式。这很重要。
我该怎么做?我在问题标题中使用numpy.savetxt
,因为它与我想要做的很接近,但我认为numpy.savetxt
本身并不能做到。
我该怎么做?
答案 0 :(得分:0)
您应该可以使用savetxt
和各种参数重新创建此输出。
需要header
和comments
。我尝试使用多行标题和comments=';'
,看看是否重现了文件标题。
fmt
控制数据的布局。您可以指定一列,它将为所有列复制,或者您可以指定所有列。看看文档并玩转。
至于数据,我从原始文件加载它,得到一个2d数组(它是全部整数)。然后用新数字替换第1列。并将其传递给您的savetxt
。
大致是:
arr = loadtxt('oldfile', etc)
arr[:,0] = newcolumn
np.savetxt('newfile', arr, header..., )
标题的另一种方法是从原始行读取相应的行,并将它们写入新文件。然后将文件保持打开状态,将其句柄传递给savetxt
。 savetxt
采用文件名或已打开文件的句柄。因此,它可以将材料添加到现有文件中。
如果你不能写自己的文件。 savetxt
没有做任何神秘的事情。它就在python代码中。编写数据的核心步骤是:
for row in X:
fh.write(asbytes(format % tuple(row) + newline))
换句话说,它逐行逐行写入2d数组。 format
源自您的输入fmt
参数。
format % tuple(row)
是正常的Python字符串格式,使用输入数组中一行的数据。尝试使用fmt
,直到获得正确的列布局。