чтение строки после повторного матча - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь прочитать координаты XYZ из длинного файла, используя python. внутри файла есть блок, который указывает, что координаты xyz находятся в следующих строках.

CARTESIAN COORDINATES (ANGSTROEM)
---------------------------------
  C     -0.283576   -0.776740   -0.312605
  H     -0.177080   -0.046256   -1.140653
  Cl    -0.166557    0.025928    1.189976

----------------------------

Я использую следующий код, чтобы найти строку, которая упоминает «CARTESIAN COORDINATES (ANGSTROEM)» и затем попробуйте выполнить итерацию, пока не найдете пустую строку для чтения координат. Однако, f.tell () указывает, что я в строке 0! Поэтому я не могу сделать следующее (f) или f.readline () до go через следующие строки (просто переходит к строке 1 из строки 0). Я не знаю, как это можно сделать с python.

def read_xyz_out(self,out):
    atoms = []
    x = []
    y = []
    z = []
    f = open(out, "r")
    for line in open(out):
        if re.match(r'{}'.format(r'CARTESIAN COORDINATES \(ANGSTROEM\)'), line):
            print(f.tell())
             #    data = line.split()
             #    atoms.append(data[0])
             #    x.append(float(data[1]))
             #    y.append(float(data[2]))
             #    z.append(float(data[3]))

Ответы [ 3 ]

1 голос
/ 01 марта 2020

Как на счет этого (примечание: непроверено, поэтому могут быть ошибки - представьте, что это эскиз решения):

def read_xyz_out(self,out):
    atoms = []
    x = []
    y = []
    z = []
    f = open(out, "r")

    # Read until you get to the data
    for line in f:
        if re.match(r'{}'.format(r'CARTESIAN COORDINATES \(ANGSTROEM\)'), line):
            # skip the next line too
            f.readline()
            break

     # Now you're into the data - the loop here picks up where the previous
     # one left off
     for line in f:
             data = line.split()
             atoms.append(data[0])
             x.append(float(data[1]))
             y.append(float(data[2]))
             z.append(float(data[3]))
    f.close()
1 голос
/ 02 марта 2020

Предположим, вы прочитали свой файл в эту строку:

My dog has fleas.
CARTESIAN COORDINATES (ANGSTROEM)
---------------------------------
  C     -0.283576   -0.776740   -0.312605
  H     -0.177080   -0.046256   -1.140653
  Cl    -0.166557    0.025928    1.189976

----------------------------

My cat too.

Затем вы можете извлечь строки 4, 5 и 6 с регулярным выражением

/CARTESIAN COORDINATES \(ANGSTROEM\)\r?\n---------------------------------\r?\n(.+?)(?=\r?\n\r?\n)/s

demo

Это выражение гласит: «соответствует строке« CARTENSION ...--- \ r? \ N », за которой следуют жадные совпадения 1+ символов в группе захвата 1, за которыми следует пустая строка с флаг '/ s' для включения '.' для совпадения концов строк ".

Затем можно извлечь нужную информацию с помощью регулярного выражения

/ *([A-Z][a-z]*) +(-?\d+.\d{6}) +(-?\d+.\d{6}) +(-?\d+.\d{6})\r?\n/

demo

Первый шаг можно пропустить, если достаточно найти строку, которая выглядит следующим образом:

C     -0.283576   -0.776740   -0.312605

без необходимости подтверждения, что перед ней стоит "CARTESIAN ...---".

демо

1 голос
/ 01 марта 2020

Вы открыли out дважды: один раз для переменной f и второй раз для for line in open(out): l oop. Каждый file объект имеет свою собственную позицию, и вы читали только со второго (который не был назначен переменной, поэтому вы не можете получить позицию). Позиция f все еще находится в начале, так как вы никогда не читаете с нее.

Вам следует использовать

for line in f:

и не вызывать open(out) во второй раз. Затем вы можете вызвать f.readline() внутри l oop, чтобы прочитать больше строк файла.

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