Вполне возможно, с небольшой потерей эффективности, выполнить бинарный поиск по отсортированному текстовому файлу с записями неизвестной длины, многократно разделяя диапазон и читая вперед после разделителя строки.Вот что я делаю, чтобы искать в CSV-файле с 2 строками заголовка для числа в первом поле.Дайте ему открытый файл и первое поле для поиска.Это должно быть довольно легко изменить для вашей проблемы.Совпадение в самой первой строке со смещением ноль не удастся, поэтому может потребоваться специальный случай.В моих обстоятельствах первые 2 строки являются заголовками и пропускаются.
Прошу прощения за отсутствие полированного питона ниже.Я использую эту и аналогичную функцию для вычисления широты и долготы GeoCity Lite непосредственно из CSV-файлов, распространяемых Maxmind.
Надеюсь, это поможет
========================================
# See if the input loc is in file
def look1(f,loc):
# Compute filesize of open file sent to us
hi = os.fstat(f.fileno()).st_size
lo=0
lookfor=int(loc)
# print "looking for: ",lookfor
while hi-lo > 1:
# Find midpoint and seek to it
loc = int((hi+lo)/2)
# print " hi = ",hi," lo = ",lo
# print "seek to: ",loc
f.seek(loc)
# Skip to beginning of line
while f.read(1) != '\n':
pass
# Now skip past lines that are headers
while 1:
# read line
line = f.readline()
# print "read_line: ", line
# Crude csv parsing, remove quotes, and split on ,
row=line.replace('"',"")
row=row.split(',')
# Make sure 1st fields is numeric
if row[0].isdigit():
break
s=int(row[0])
if lookfor < s:
# Split into lower half
hi=loc
continue
if lookfor > s:
# Split into higher half
lo=loc
continue
return row # Found
# If not found
return False