Я пытаюсь прочитать массивный (более 5 миллионов строк) файл .dat, который полон данных для загрузки частиц. Пустая строка в файле представляет новое «событие». Мне нужно создать класс, который хранит все данные о каждой частице в событии и может читать в следующем событии по запросу.
У меня вроде есть представление о том, как читать файл .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, 1270.0, 0.94]
[-2212, 1.9, -0.291, -0.126, -1.62, 0.938]
[-2112, 27.8, 0.034, -0.207, 27.8, 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, 1.9, 0.128, -0.109, -1.64, 0.94]
None
[2112, 3760.0, 0.242, 0.228, 3760.0, 0.94]
[2212, 1490.0, -0.259, 0.0808, -1490.0, 0.938]
None
[2112, 882.0, -0.242, -0.034, -882.0, 0.94]
[2212, 1.45, 0.019, 0.0212, 1.11, 0.938]
[-2112, 1.35, 0.00263, 0.685, 0.685, 0.94]
[2112, 73.5, 0.626, -1.37, 73.5, 0.94]
[-2112, 45.2, 0.772, -0.0107, 45.1, 0.94]
[2112, 2200.0, -0.514, 0.233, 2200.0, 0.94]
[2212, 10.8, 0.182, 0.131, -10.7, 0.938]
[-2212, 13.9, 0.0862, 0.141, -13.9, 0.938]
[2112, 29.8, 0.318, -0.647, -29.8, 0.94]
[-2212, 127.0, 0.0809, -1.03, -127.0, 0.938]
Что-то вроде того, что я хочу, но это займет более получаса, чтобы прочитать и распечатать все мои частицы, так что я надеюсьесть более быстрый способ сделать это. Я также не уверен, как написать класс, который будет хранить все частицы для события, а затем сможет читать в следующем событии по запросу.
Я ужасен в кодировании, так что я уверен, что это ужасный код, поэтому любая помощь или совет, который вы можете предложить, будет принята с благодарностью! Я использую Python 3.6 на всякий случай, если вам нужно знать.