Поиск слова в строке по индексу
Имеется файл 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 шт):
В данном случае, поскольку позиции чётко фиксированы, я бы проверял так:
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='')
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_': 'Прогул'}