我正在尝试读取一个庞大的.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,以防万一您需要知道。