Чтение файла для определенного раздела в Python

Я пытаюсь следовать ответу, приведенному здесь:

Как только читать строки в текстовом файле после определенной строки, используя Python?

при чтении только строки после определенной фразы, в которой я пошел логическим путем, или второго ответа.

Мне нужно получить только цифры между двумя открывающими и закрывающими секциями из файла

<type>
1 
2
3
<type>

Однако, когда я использовал этот код:

found_type = False
t_ype = [] 
with open('test.xml', 'r') as f:
    for line in f:
        if '<type>' in line:
            found_type = True
        if found_type:
            if '</type>' in line:
               found_type = False               
            else:    
                t_line = str(line).rstrip('\n')
                t_ype.append(t_line)

Я не могу пропустить первую строку и получить:

'<type>', '1','2','3'

Где я просто хочу

'1','2','3'

заканчивая добавление в список, когда я нажимаю, поскольку мне это не нужно в моем списке

Я не уверен, что делаю неправильно, и не могу спросить на странице, потому что мой представитель недостаточно высок.

3 ответа

Решение

Вы должны пропустить оставшуюся часть цикла for после обнаружения "заголовка". В вашем коде вы устанавливаете found_type в True а затем if found_type: проверить совпадения.

found_type = False
t_ype = [] 
with open('test.xml', 'r') as f:
    for line in f:
        if '<type>' in line:
            found_type = True
            continue                    # This is the only change to your code.
                                        # When the header is found, immediately go to the next line
        if found_type:
            if '</type>' in line:
               found_type = False               
            else:    
                t_line = str(line).rstrip('\n')
                t_ype.append(t_line)

Самый простой подход - это двойной цикл с выходом:

def section(fle, begin, end):
    with open(fle) as f:
        for line in f:
            # found start of section so start iterating from next line
            if line.startswith(begin):
                for line in f: 
                    # found end so end function
                    if line.startswith(end):
                        return
                    # yield every line in the section
                    yield line.rstrip()     

Тогда просто позвоните list(section('test.xml','<type>','</type>')) или перебрать for line in section('test.xml','<type>','</type>'):use lines, если у вас есть повторяющиеся разделы, то обменять возврат на перерыв. Вам также не нужно вызывать str в строках, так как они уже являются строками. Если у вас большой файл, то групповой подход в комментариях может быть лучшей альтернативой.

Я хотел бы прочитать от 1 до 9 файла в python, начиная с ## $Numbers и заканчивая перед запуском ## $Next_numbers.

Изображение проясняет мое описание

Другие вопросы по тегам