Знакомый формат, файлы эти явно из выгрузок Россвязи. Я через такие данные прогонял десятки миллионов номеров, причём задачи сделать быстро и эффективно у меня не было.
Если не использовать базы данных, то можно просто сохранить диапазоны в массиве, отсортированными по началу диапазона (файлы уже в таком виде), и прерывать обработку, когда пройдём нужное место:
prefix_code = '495'
number = '1234567'
for row in data_rows[prefix_code]:
range_start, range_end, range_size, range_owner, range_region = row
if number < range_start:
continue # переходим к следующему
if number <= range_end:
print (f"Found {range_owner}, {range_region}")
else:
print ("Not found")
break
Тут на самом деле номера неявно уже в исходных данных хешированы по трёхзначному коду. Можно для ускорения ещё больше порубить, например, по следующим трём цифрам, но если какие-то из диапазонов будет пересекать границу этих префиксов, то появятся дополнительные сложности.
Если через базу, то просто сделать запрос в стиле (тут всё в числа переведено, строки не нужны):
SELECT * FROM ranges_data WHERE prefix_code=495 AND 1234567 BETWEEN range_start AND range_end;