Поиск слова в строке по индексу

Имеется файл 100к+ строк. В файле по позиции раскиданы различные значения различных типов. К примеру:

020120 1234 Олег Прогул

030220 5678 Петя Опоздание

260220 9012 Ваня Прогул

260220 3456 Макс Опоздание

где, 020120 - позиция 01...06, длина 6,  тип TIME

разделитель - позиция 07, длина 1, тип CHAR

1234 - позиция 08...11, длина 4, тип CHAR

разделитель - позиция 12, длина 1, тип CHAR  

и так далее.

На текущий момент ищу следующим образом:

from __future__ import print_function
import io

name = input('Введите имя: ')
type = input('Введите причину: ')

with io.open('1.txt') as file:
     for line in file:
          if name in line and type in line:
               print(line, end='')

Но такой поиск не всегда корректно выводит результаты, особенно если Олег запихнут в другое поле.

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


Ответы (2 шт):

Автор решения: CrazyElf

В данном случае, поскольку позиции чётко фиксированы, я бы проверял так:

if name == line[12:16] and type == line[17:]:
    print(line, end='')

Не уверен только, не будет ли в конце перевод строки, возможно, его нужно будет откусить через функцию strip().

Другой вариант, если не хотите связываться с позициями и ни в одном из полей точно нет пробелов:

fields = line.split()
if name == fields[2] and type == fields[3]:
    print(line, end='')
→ Ссылка
Автор решения: vadim vaduxa
A = ''' 020120 1234 Олег Прогул
030220 5678 Петя Опоздание

260220 9012 Ваня Прогул
260220 3456 Макс Опоздание '''

indx_keys = [("position", 6), ('', 1), ("length", 4), ('', 1), ("name", 4), ('', 1), ]
last = "type_"

for line in filter(bool, map(str.strip, A.split('\n'))):
    i1 = i2 = 0
    dt = {}
    for (k, i2) in indx_keys:
        i2 += i1
        if k: dt[k] = line[i1:i2]
        i1 = i2
    dt[last] = line[i2:]

    if (dt['name'] == 'Олег') and (dt['type_'] == 'Прогул'):
        print(dt)  # {'position': '020120', 'length': '1234', 'name': 'Олег', 'type_': 'Прогул'}
→ Ссылка