Общий подход к этой проблеме, чтение текстового файла в обратном порядке по строкам, может быть решен по крайней мере тремя способами.
Общая проблема заключается в том, что, поскольку каждая строка может иметь различную длину,Вы не можете знать заранее, где каждая строка начинается в файле, и сколько их там.Это означает, что вам нужно применить некоторую логику к проблеме.
Общий подход # 1: Читать весь файл в память
При таком подходе вы просто читаете весь файл в память, в некоторыхструктура данных, которая впоследствии позволяет обрабатывать список строк в обратном порядке.Стек, двусвязный список или даже массив могут сделать это.
Плюсы: Действительно прост в реализации (вероятно, встроенный в Python для всех, что я знаю)
Минусы: Использует много памяти, может потребоваться некоторое время для чтения больших файлов
Общий подход # 2: Прочитать весь файл, сохранить положение строк
При таком подходе вытакже прочитайте весь файл один раз, но вместо того, чтобы хранить весь файл (весь текст) в памяти, вы сохраняете только двоичные позиции внутри файла, где начиналась каждая строка.Вы можете хранить эти позиции в структуре данных, аналогичной той, в которой хранятся строки в первом подходе.
Везде, где вы хотите прочитать строку X, вы должны перечитать строку из файла, начиная сположение, которое вы сохранили для начала этой строки.
Плюсы: Практически так же легко реализовать, как и первый подход
Минусы: чтение может занять некоторое времябольшие файлы
Общий подход № 3: прочитать файл в обратном порядке и «разобраться»
При таком подходе вы будете читать файл по блокам или аналогичным, с конца, ипосмотри, где концы.В основном у вас есть буфер, скажем, 4096 байт, и вы обрабатываете последнюю строку этого буфера.Когда ваша обработка, которая должна перемещаться на одну строку за раз в этом буфере, доходит до начала буфера, вам необходимо прочитать данные из другого буфера из области перед первым прочитанным буфером и продолжить обработку.
Этот подход, как правило, более сложный, потому что вам нужно обрабатывать такие вещи, как разрыв строк по двум буферам, а длинные строки могут даже покрывать более двух буферов.
Однако, этотот, который потребовал бы наименьшего объема памяти, и для действительно больших файлов, возможно, также стоило бы сделать это, чтобы сначала не читать гигабайты информации.
Плюсы: Использует мало памяти, не требует, чтобы вы сначала прочитали весь файл
Минусы: Сложно реализовать и получить право на все угловые случаи
В сети есть множество ссылок, которыепоказывает, как сделать третий подход: