【问题标题】:How to parse arrays which vary between data sets?如何解析在数据集之间变化的数组?
【发布时间】:2018-01-06 10:56:16
【问题描述】:

我有以下数据集:

文件1:

<Molecular Orbital Primitive Coefficients>
<MO Number>
1
</MO Number>
 4.224609607748e+00  4.085857782359e+00  1.273383604708e+00 -6.802974691818e-03
 9.099528133406e-03  6.867550219273e-03  5.859231188647e-03  3.684441849425e-03
 5.836775773317e-04 -2.316776085880e-16 -1.456850991492e-16 -2.307897076406e-17
 4.140895678156e-03  2.603906355541e-03  4.125025757803e-04 -1.739011495381e-03
-1.681896173898e-03 -5.241735641835e-04 -1.739011375813e-03 -1.681896058258e-03
-5.241735281434e-04
<MO Number>
2
</MO Number>
-9.785273892788e-01 -9.463889258321e-01 -2.949481372149e-01 -1.974411643609e-01
 2.640935048539e-01  1.993153249903e-01  2.392564397119e-01  1.504508715968e-01
 2.383394930083e-02  8.865383702284e-16  5.574791243465e-16  8.831407252698e-17
 1.690897356483e-01  1.063281646128e-01  1.684417017817e-02  4.608108515392e-02
 4.456761845182e-02  1.388977974599e-02  4.608108208174e-02  4.456761548054e-02
 1.388977881997e-02
</Molecular Orbital Primitive Coefficients>

文件2:

<Molecular Orbital Primitive Coefficients>
<MO Number>
1
</MO Number>
 3.299451113326e-02  6.087754902119e-02  9.880244651376e-02  1.066781206974e-01
 6.773109582562e-02  1.104778461514e-02 -2.156994392623e-02  3.071021124268e-17
 1.072251279194e-16 -1.396334606969e-02 -2.002731618626e-16 -9.993341885751e-17
<MO Number>
2
</MO Number>
-2.009498358678e-04 -3.707687449719e-04 -6.017466156746e-04 -9.474065009358e-02
 3.917924760214e-01 -1.299844008310e-01  1.579980866207e-01 -2.827902468319e-15
 1.152587596877e-15 -2.310895197449e-01  2.213502483059e-15 -1.048685827923e-15
<MO Number>
 3
</MO Number>
-1.763944008217e-17 -3.254619757728e-17 -5.282150804455e-17 -3.109320915001e-16
-9.633800372448e-16 -1.118676262789e-17 -1.336368133403e-15 -1.286598202313e+00
-1.412088253954e+00  2.299271905206e-15  1.305465570574e+00  1.432795875849e+00
 3.494418486873e-16 -1.710573251253e-01 -1.877416268172e-01 -7.134748738863e-16
</Molecular Orbital Primitive Coefficients>

此数据集因文件的数组大小和数组数量而异(即,某些文件可能有 70 个数组,因此有 70 个 MO 编号,而其他文件有 10 个)。我正在尝试编写一个函数,将 MO Number 标头之间的数据解析为数组。这是我目前所拥有的:

def function3(start, end):
    """Read MO information."""
    config_found = False
    var = []
    for line in f:
        if line.strip() == end:
            config_found = False
        elif config_found:
            i = line.rstrip()
            var.append(i)
        elif line.strip() == start:
            config_found = True
    var1 = [elem.strip() for elem in var]
    var2 = var1[1:-1]
    var3 = np.array([line.split() for line in var2])
    var3 = np.asarray([list(map(float, item)) for item in var3])
    return var3
m = {'start1':'1','end1':'2',
         'start2':'2','end2':''}
with open(filename, 'r') as f:
    v['monumber1']=function3(m['start1'],m['end1'])
    v['monumber2']=function3(m['start2'],m['end2'])

问题是我需要为某些文件设置这些变量 70 次!此外,最终数组的开始和结束变量并非适用于所有文件。有没有其他方法可以解决这个问题?

谢谢!

【问题讨论】:

  • 有正则表达式和numpy的可能性...
  • 添加regexnumpy 标签可能会有所帮助!
  • 您的数据源是否提出了阅读本文的标准? 和 > 的使用建议使用 xml 模型。但只是在松散的意义上。
  • @hpaulj 我不完全确定您的评论是什么意思。这是一个 .wfx 文件,如果有帮助的话……
  • aim.tkgristmill.com/wfxformat.html AIM 扩展波函数文件(.wfx 文件)

标签: python arrays regex python-2.7 numpy


【解决方案1】:

根据 Vinicius 的评论,我尝试了一些正则表达式,请看看它是否有帮助。通常不建议使用 read() 方法,但由于本例中您的数据不是太多,所以我使用了它。

import re

x = []
with open(filename, 'r') as fh:
    x = re.findall(r'\d\.\d+e[-+]\d+', fh.read())

out = map(float, x)

希望这会有所帮助,根据您的输入,上述内容对我有用。 file2 的输出如下:

[0.03299451113326, 0.06087754902119, 0.09880244651376, 0.1066781206974, 0.06773109582562, 0.01104778461514, 0.02156994392623, 3.071021124268e-17, 1.072251279194e-16, 0.01396334606969, 2.002731618626e-16, 9.993341885751e-17, 0.0002009498358678, 0.0003707687449719, 0.0006017466156746, 0.09474065009358, 0.3917924760214, 0.129984400831, 0.1579980866207, 2.827902468319e-15, 1.152587596877e-15, 0.2310895197449, 2.213502483059e-15, 1.048685827923e-15, 1.763944008217e-17, 3.254619757728e-17, 5.282150804455e-17, 3.109320915001e-16, 9.633800372448e-16, 1.118676262789e-17, 1.336368133403e-15, 1.286598202313, 1.412088253954, 2.299271905206e-15, 1.305465570574, 1.432795875849, 3.494418486873e-16, 0.1710573251253, 0.1877416268172, 7.134748738863e-16]

【讨论】:

  • 不完全是......文件中还有其他数据,所以我需要使用标题将每个数组专门解析为一个单独的变量。不过还是谢谢你!
  • 也可以使用正则表达式,将尝试获取正确的正则表达式。没有比 1,2..70 更好的标题了吗?我可以使用 Number> 吗?不客气
猜你喜欢
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多