Функция read_line_from_end читает файл file_name и, за один цикл, перемещает курсор в файле с позиции переданной в аргумент cursor в начало на 1 байт. После этого считывает строку и если прочтенная строка не является символом перевода строки '\n', то строка сохраняется в результат и чтение продолжается. Иначе цикл прерывается и функция возвращает строку и позицию курсора.
В вызываемую функцию в аргумент cursor передается последний байт и имя файла. Последний байт получаем с помощью вычисления размера файла используя метод path.get модуля os.
Функция read_line_from_end вызывается в цикле до тех пор пока курсор не достигнет 0 байта т.е. начала файла.
import os
def read_line_from_end(cursor, file_name):
with open(file_name, 'r') as zen:
while cursor > 0:
cursor -= 1
zen.seek(cursor)
text = zen.readline()
if text == '\n':
cursor -= 1
break
result = text
return result.strip('\n'), cursor
position = os.path.getsize('zen.txt')
while position > 0:
line, position = read_line_from_end(position, 'zen.txt')
print(line)