我有多个名为 ParticleCoordW_10000.dat、ParticleCooordW_20000.dat 等的文本文件……这些文件都看起来像这样:
ITEM: TIMESTEP
10000
ITEM: NUMBER OF ATOMS
1000
ITEM: BOX BOUNDS pp pp pp
0.0000000000000000e+00 9.4000000000000004e+00
0.0000000000000000e+00 9.4000000000000004e+00
0.0000000000000000e+00 9.4000000000000004e+00
ITEM: ATOMS id x y z
673 1.03559 0.495714 0.575399
346 2.74458 1.30048 0.0566235
991 0.570383 0.589025 1.44128
793 0.654365 1.33452 1.91347
969 0.217201 0.6852 0.287291
.
.
.
.
我想用python提取单个粒子的坐标,让我们说ATOM ID:673。问题是ATOM ID:673的行位置在每个文本文件中都会发生变化。所以我想让 Python 能够在目录的每个文本文件中找到 ATOM #673 并保存相关的 xyz 坐标。
以前我使用这样的东西来获取所有坐标:
filenames = glob.glob('*.dat')
for f in filenames:
x_data = np.loadtxt(f,usecols=[1],skiprows = 9)
y_data = np.loadtxt(f,usecols=[2],skiprows = 9)
z_data = np.loadtxt(f,usecols=[3],skiprows = 9)
coord = np.vstack((x_data,y_data,z_data)).T
有没有办法修改这个脚本以执行前面描述的任务?
编辑:根据各种评论,我写了以下内容:
coord = []
filenames = natsort.natsorted(glob.glob('*.dat'))
for f in filenames:
buff = open(f, 'r').readlines()
for row in buff:
if row.startswith('673'):
coord.append(row)
np.savetxt("xyz.txt",coord,fmt,delimiter=' ')
这允许我在目录中的所有文本文件中对单个粒子的所有坐标进行分组。但是,我希望为所有粒子 ID(1000 个粒子)完成此过程。最有效的方法是什么?