Мне нужно знать, как читать строки из файла в python, чтобы я сначала прочитал последнюю строку и продолжал в том же духе, пока курсор не достигнет начала файла. Любые идеи?
Общий подход к этой проблеме, считывание текстового файла в обратном порядке, по строкам, может быть решен по крайней мере тремя способами.
Общая проблема заключается в том, что, поскольку каждая строка может иметь разную длину, вы не можете заранее знать, где каждая строка начинается в файле, и сколько их там. Это означает, что вам нужно применить некоторую логику к проблеме.
При таком подходе вы просто считываете весь файл в память в некоторой структуре данных, которая впоследствии позволяет вам обрабатывать список строк в обратном порядке. Это может сделать стек, двусвязный список или даже массив.
Плюсы: Очень легко реализовать (возможно, встроен в Python, насколько я знаю)
Минусы: Использует много памяти, может потребоваться некоторое время для чтения больших файлов
При таком подходе вы также читаете весь файл один раз, но вместо того, чтобы сохранять весь файл (весь текст) в памяти, вы сохраняете только двоичные позиции внутри файл, в котором начиналась каждая строка. Вы можете сохранить эти позиции в структуре данных, аналогичной той, которая хранит строки в первом подходе.
Когда бы вы ни захотели прочитать строку X, вы должны перечитать строку из файла, начиная с позиции, которую вы сохранили для начала этой строки.
Плюсы: Практически так же легко реализовать, как и первый подход
Минусы: может занять некоторое время, чтобы прочитать большие файлы
При таком подходе вы будете читать файл поблочно или аналогично, с конца и видеть, где находятся концы. По сути, у вас есть буфер, скажем, 4096 байт, и вы обрабатываете последнюю строку этого буфера. Когда ваша обработка, которая должна перемещать по одной строке назад в этом буфере, доходит до начала буфера, вам нужно прочитать данные другого буфера из области перед первым читаемым буфером и продолжить обработку.
Этот подход обычно более сложен, потому что вам нужно обрабатывать такие вещи, как разбиение строк на два буфера, а длинные строки могут даже покрывать более двух буферов.
Однако это тот, который потребует наименьшего количества памяти, и для действительно больших файлов, возможно, также стоит сделать это, чтобы сначала не прочитать гигабайты информации.
Плюсы: Использует мало памяти, не требует, чтобы вы сначала читали весь файл
Минусы: Сложно реализовать и исправить во всех угловых случаях
На net, который показывает, как реализовать третий подход: