Как читать и хранить данные из файла .dat для частиц в классе (Python 3.6) - PullRequest
0 голосов
/ 09 ноября 2019

Я пытаюсь прочитать массивный (более 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 на всякий случай, если вам нужно знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...