2016-12-04 4 views
1

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

header_1 

some text 
------------ 
----------- 
some text 

header_2 

some text 
------------ 
----------- 
some text 

header_3 

some text 
------------ 
----------- 
some text 

я линия чтение построчно так:

if line=='header_1': 
    flag_1 = True 

if line=='header_1': 
    flag_1 = False 
    flag_2 = True 

if flag_1: 
    data_1.append(line) 
elif flag_2: 
    data_2.append(line) 

То, что я хочу, чтобы избежать, чтобы снова установить предыдущие флаги ложному каждый раз, когда я получаю к следующей части файла или сделать это более эффективным способом.

ответ

1

Почему бы не заменить флаги с одной state переменной

skip, h1, h2 = range(3) 
state = skip 
for line in lines: 
    if line == 'header_1': 
     state = h1 
     continue 
    elif line == 'header_2': 
     state = h2 
     continue 

    if state == h1: 
     data_1.append(line) # or whatever 
    elif state == h2: 
     data_2.append(line) 

Это очень гибкий подход: если флаги не являются взаимоисключающими, вы можете использовать set флагов:

h4, h5 = range(4, 6) 
for line in lines: 
    if line == 'header_45': 
     state == {h4, h5} 
     continue 

    if state == {h5, h4}: 
     do_smth() 
    if h5 in state: 
     do_smth_more() 
1

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

result = [] 
for line in file: 
    if line.startswith('header_'): 
     result.append([]) 
    else: 
     result[-1].append(line) 

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

+0

Непонятно, что проблема касается, например, «header_» + числа. Как насчет заголовков, у которых нет шаблонов? – Musen

+0

@Musen - Не может быть никакой программы без шаблона, и было бы бессмысленно создавать такие заголовки в любом случае. Кроме того, код в вопросе имеет заголовки с шаблоном. – TigerhawkT3

0

Создайте словарь с заголовками в виде ключей и соответствующих списков данных в качестве значений. Сохраните последний действительный заголовок в памяти. Итак:

dict_of_results = {} 
curr_header = "" 
for line in file: 
    if line.startswith('header_'): 
     curr_header = line 
    if curr_header not in dict_of_results: 
     dict_of_results[curr_header] = [] 
    dict_of_results[curr_header].append(line) 

Эта форма также позволяет отображать те же заголовки в разных местах.

+2

Вы можете заменить 'if curr_header не в dict_of_results:' либо 'dict.get (key, default)', либо используя 'defaultdict' –

1

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

toAppend = [[], []] 
flag = 0 

for line in f: 
    if line =='header_1': 
    flag = 1 
    elif line == 'header_2': 
    flag = 2 

    if flag: 
    toAppend[flag - 1].append(line) 
Смежные вопросы