вы хотите построить индекс в памяти для файла:
- создать пустой список
open
файл
- читать его построчно (используя
f.readline()
, и сохранять в списке кортеж, состоящий из значения, по которому вы хотите отсортировать (извлекается с помощью line.split('\t').strip()
), и смещения строки в файле (которое вы можно позвонить по номеру f.tell()
до звонка f.readline()
)
close
файл
sort
список
Затем, чтобы распечатать отсортированный файл, снова откройте файл и для каждого элемента вашего списка, используйте f.seek(offset)
, чтобы переместить указатель файла в начало строки, f.readline()
, чтобы прочитать строку и print
строку ,
Оптимизация: вы можете сохранить длину строки в списке, чтобы вы могли использовать f.read(length)
на этапе печати.
Пример кода (оптимизирован для удобства чтения, а не скорости):
def build_index(filename, sort_col):
index = []
f = open(filename)
while True:
offset = f.tell()
line = f.readline()
if not line:
break
length = len(line)
col = line.split('\t')[sort_col].strip()
index.append((col, offset, length))
f.close()
index.sort()
return index
def print_sorted(filename, col_sort):
index = build_index(filename, col_sort)
f = open(filename)
for col, offset, length in index:
f.seek(offset)
print f.read(length).rstrip('\n')
if __name__ == '__main__':
filename = 'somefile.txt'
sort_col = 2
print_sorted(filename, sort_col)