如何从.dat文件读取和存储类中粒子的数据(Python 3.6)

我正在尝试读取一个庞大的.dat文件(超过500万行),该文件充满了用于加载粒子的数据。文件中的空白行表示新的“事件”。我需要创建一个类,该类存储事件中每个粒子的所有数据,并在请求时可以在下一个事件中读取。

我有点了解如何读取.dat文件。到目前为止,我有:

def __init__(self,file="file.dat"):
    file = open(file)
    lines = file.realines()

    for line in lines:
        particle = []
        if line.startswith((" 2112"," 2212","-2112","-2212")) == True:
            pid = int(shlex.split(line)[0])
            E = float(shlex.split(line)[1])
            px = float(shlex.split(line)[2])
            py = float(shlex.split(line)[3])
            pz = float(shlex.split(line)[4])
            m = float(shlex.split(line)[5])
            particle.append(pid)
            particle.append(E)
            particle.append(px)
            particle.append(py)
            particle.append(pz)
            particle.append(m)
            print(particle)
        else:
            line = None
            print(line)

.dat文件如下:

# PID  E         px        py        pz        m

 2112  1.27e+03 -1.40e-01 -1.74e-01  1.27e+03  9.40e-01
-2212  1.90e+00 -2.91e-01 -1.26e-01 -1.62e+00  9.38e-01
-2112  2.78e+01  3.40e-02 -2.07e-01  2.78e+01  9.40e-01
 2112  3.50e+01  2.96e-01  2.05e-01  3.49e+01  9.40e-01
 2212  8.46e+02 -4.31e-02 -1.60e-01 -8.46e+02  9.38e-01
 2112  1.90e+00  1.28e-01 -1.09e-01 -1.64e+00  9.40e-01

 2112  3.76e+03  2.42e-01  2.28e-01  3.76e+03  9.40e-01
 2212  1.49e+03 -2.59e-01  8.08e-02 -1.49e+03  9.38e-01

 2112  8.82e+02 -2.42e-01 -3.40e-02 -8.82e+02  9.40e-01
 2212  1.45e+00  1.90e-02  2.12e-02  1.11e+00  9.38e-01
-2112  1.35e+00  2.63e-03  6.85e-01  6.85e-01  9.40e-01
 2112  7.35e+01  6.26e-01 -1.37e+00  7.35e+01  9.40e-01
-2112  4.52e+01  7.72e-01 -1.07e-02  4.51e+01  9.40e-01
 2112  2.20e+03 -5.14e-01  2.33e-01  2.20e+03  9.40e-01
 2212  1.08e+01  1.82e-01  1.31e-01 -1.07e+01  9.38e-01
-2212  1.39e+01  8.62e-02  1.41e-01 -1.39e+01  9.38e-01
 2112  2.98e+01  3.18e-01 -6.47e-01 -2.98e+01  9.40e-01
-2212  1.27e+02  8.09e-02 -1.03e+00 -1.27e+02  9.38e-01

因此第一行只是标题,用于解释每一列所代表的内容。第一个事件由该第一块中的6个粒子组成。然后有一个空白行,表明下一个粒子处于新事件中。 2行的下一个块是一个新事件。接下来的10行代码块也是一个单独的事件。

我已经在代码中加入了print行,以便可以看到它在做什么-它们不会出现在最终代码中。当我运行它并调用初始化程序时,它会打印:

None
None
[2112,1270.0,-0.14,-0.174,0.94]
[-2212,1.9,-0.291,-0.126,-1.62,0.938]
[-2112,27.8,0.034,-0.207,0.94]
[2112,35.0,0.296,0.205,34.9,0.94]
[2212,846.0,-0.0431,-0.16,-846.0,0.938]
[2112,0.128,-0.109,-1.64,0.94]
None
[2112,3760.0,0.242,0.228,1490.0,-0.259,0.0808,-1490.0,0.938]
None
[2112,882.0,-0.242,-0.034,-882.0,1.45,0.019,0.0212,1.11,1.35,0.00263,0.685,73.5,0.626,-1.37,0.94]
[-2112,45.2,0.772,-0.0107,45.1,2200.0,-0.514,0.233,10.8,0.182,0.131,-10.7,0.938]
[-2212,13.9,0.0862,0.141,-13.9,29.8,0.318,-0.647,-29.8,127.0,0.0809,-1.03,-127.0,0.938]

这是我想要的,但是要花半个多小时才能读取并打印我所有的粒子,所以我希望可以有一种更快的方法。我也不确定如何编写一个类来存储事件的所有粒子,然后在请求时可以在下一个事件中读取。

我很害怕编码,所以我确定这是糟糕的代码,因此,您能提供的任何帮助或建议将不胜感激!我正在使用Python 3.6,以防万一您需要知道。

mada_baidu 回答:如何从.dat文件读取和存储类中粒子的数据(Python 3.6)

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3132819.html

大家都在问