Сохранение n строк после совпадения строк в файле с переменной - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь написать скрипт, который может читать текстовый файл и сохранять определенные строки в виде списков. Текстовый файл выглядит примерно так:

TRIAL1

Энергия: 54432

Координаты:

0,7 0,4 0,5

0,3 0,4 0,1

0,3 0,4 0,3

в файле есть еще много испытаний (TRIAL2, TRIAL3 и т. Д. С соответствующей энергией и координатами), но я хочу иметь возможность выбрать одно конкретное испытание и сохранить его соответствующие координаты в списке (для последующей манипуляции).

Пока я написал:

with open('energy.txt') as f:
   for line in f:
        if 'TRIAL1' in line:

Я не уверен, как затем пропустить строки "Энергия" и "Координаты" и сохранить только координаты в переменной.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

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

with open('energy.txt') as f:
    while True:
        trial = f.readline() # assume this line is "TRIAL#"
        energy = f.readline() # assume this line is "ENERGY:..."
        coordinates_label = f.readline() # assume this line is "Coordinates:"
        coordinates = f.readline()
        while "TRIAL" not in coordinates
            # parse the coordinates here

Чтобы игнорировать строку, просто не присваивайте f.readline() переменной. Если между каждой строкой ввода есть действительно пустые строки, просто добавьте соответствующие f.readline() вызовы.

Примечание: улучшение цикла while True: оставлено в качестве упражнения для читателя.

0 голосов
/ 11 марта 2019

Предполагается, что все блоки "TRIAL" выглядят так же, как ваш пример (адаптируется под ваш сценарий):

lines = """TRIAL1
Energy: 54432
Coordinates:
0.7 0.4 0.5
0.3 0.4 0.1
0.3 0.4 0.3
TRIAL2
Energy: 54432
Coordinates:
test1
test2
test3"""

# initialize our control variables
counter = 0
collect = False

for line in lines.splitlines():
    if 'TRIAL2' in line:
        # mark the beginning of the block
        counter = 0
        collect = True
        continue
    if not collect:
        # nothing to do, go to next line
        continue
    else:
        # count the lines
        counter += 1
        if 2 < counter < 6:
            # use the 3rd, 4th and 5th line
            print(line)
        elif counter == 6:
            # stop collection at the 6th line of the block
            collect = False

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