选择性解析大型数据文件

3

任务:

- 我运行了一个分子振动的模拟,每0.1飞秒拍摄一次我的原子位置。

- 现在我需要浏览输出,并收集所有这些不同的笛卡尔坐标集合(共50个)。

- 几何结构以良好的格式呈现,但在几何段之间有相同格式的额外内容(请参见示例)。

示例(这是我要解析的文件中的50个相同段之一,只有16个原子而不是4个。)

  Time in trajectory (femtosec)    3.300000D+00
 Total energy (au)  -2.716055737D+02
 Total angular momentum (h-bar)   5.485831060D-14
 Coordinates (Bohr)
 I=    1 X=  -1.573316541788D+00 Y=  -3.143098097327D-01 Z=  -9.488852008364D-01
 I=    2 X=  -1.549056004901D+00 Y=  -3.758762443395D-01 Z=   1.621875214114D+00
 I=    3 X=   7.633881398143D-01 Y=  -3.853052819189D-01 Z=   3.487630749614D-01
 I=    4 X=   2.390273062744D+00 Y=   1.832192143047D+00 Z=   6.235281069720D-01


 Momentum (sqrt(amu)*Bohr/sec)
 I=    1 X=  -3.536362458214D+13 Y=   2.431139678255D+13 Z=   1.413087646815D+13
 I=    2 X=  -2.526353110947D+13 Y=  -2.551987667221D+12 Z=   7.250485757030D+12
 I=    3 X=  -1.190415840625D+13 Y=  -1.311816871612D+13 Z=  -4.638293368564D+12
 I=    4 X=   6.566472312459D+12 Y=  -2.248922363477D+13 Z=  -4.123675084717D+11

我希望有一种方法可以循环遍历文件并读取坐标,然后跳过动量信息并剥离所有额外的信息,例如I =,X =等。

我想将其转换为一个3D numpy数组,其中我的坐标将按以下方式索引:(迭代次数,原子编号和x y或z坐标)。 我不知道正则表达式在这里是否有用,因为动量部分的行具有相同的格式。 您们是否能给我提供指导方向?

如果有相关资源附带答案,将非常感激,因为我没有时间限制,所以我希望从中学习一些东西。


1
如果文件是一致的,我会逐行搜索“坐标(Bohr)”并处理接下来的16行,将该信息放入字典中,使用迭代和原子编号作为元组键,使用包含XYZ信息的元组作为值。 - Zifendale
1
我同意^,而且您可以使用split函数(使用空格字符作为分隔符)来解析该行,因为数据是一致的。 - jteezy14
谢谢你们俩的帮助,我会尝试一下的。 - Ajay
1个回答

1
你可以使用numpy.genfromtxt()函数,该函数接受生成器并因此允许您对输入进行一些自定义。例如,在这里,我将D替换为e,忽略所有以'M''C'开头的行。此外,我仅使用包含所需数据的列(3,5,7)。最后,数组被重新整形以使每个“动量”分离并通过第一个索引访问(假设它们始终有4行):
gen = (r.replace('D','e') for r in open('test.txt') if not r[0] in ['C','M'])
a = np.genfromtxt(gen, skip_header=3, usecols=(3, 5, 7))
a = a.reshape(-1, 4, 3)

#[[[ -1.57331654e+00  -3.14309810e-01  -9.48885201e-01]
#  [ -1.54905600e+00  -3.75876244e-01   1.62187521e+00]
#  [  7.63388140e-01  -3.85305282e-01   3.48763075e-01]
#  [  2.39027306e+00   1.83219214e+00   6.23528107e-01]]
#
# [[ -3.53636246e+13   2.43113968e+13   1.41308765e+13]
#  [ -2.52635311e+13  -2.55198767e+12   7.25048576e+12]
#  [ -1.19041584e+13  -1.31181687e+13  -4.63829337e+12]
#  [  6.56647231e+12  -2.24892236e+13  -4.12367508e+11]]]

在这个数组中,您将使用第一个、第二个和第三个索引访问动量、I和(X、Y、Z):

a[0,1,2] #first momentum, second I and third coordinate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接