Как читать строки из файла в Python, начиная с конца

Мне нужно знать, как читать строки из файла в python, чтобы я сначала прочитал последнюю строку и продолжал в том же духе, пока курсор не достигнет начала файла. Любые идеи?

12
задан Richard 25 August 2010 в 17:55
поделиться

2 ответа

Общий подход к этой проблеме, считывание текстового файла в обратном порядке, по строкам, может быть решен по крайней мере тремя способами.

Общая проблема заключается в том, что, поскольку каждая строка может иметь разную длину, вы не можете заранее знать, где каждая строка начинается в файле, и сколько их там. Это означает, что вам нужно применить некоторую логику к проблеме.

Общий подход №1: считывание всего файла в память

При таком подходе вы просто считываете весь файл в память в некоторой структуре данных, которая впоследствии позволяет вам обрабатывать список строк в обратном порядке. Это может сделать стек, двусвязный список или даже массив.

Плюсы: Очень легко реализовать (возможно, встроен в Python, насколько я знаю)
Минусы: Использует много памяти, может потребоваться некоторое время для чтения больших файлов

Общий подход # 2: Прочитать весь файл, сохранить позицию строк

При таком подходе вы также читаете весь файл один раз, но вместо того, чтобы сохранять весь файл (весь текст) в памяти, вы сохраняете только двоичные позиции внутри файл, в котором начиналась каждая строка. Вы можете сохранить эти позиции в структуре данных, аналогичной той, которая хранит строки в первом подходе.

Когда бы вы ни захотели прочитать строку X, вы должны перечитать строку из файла, начиная с позиции, которую вы сохранили для начала этой строки.

Плюсы: Практически так же легко реализовать, как и первый подход
Минусы: может занять некоторое время, чтобы прочитать большие файлы

Общий подход № 3: Прочитайте файл в обратном порядке и "рисунок it out "

При таком подходе вы будете читать файл поблочно или аналогично, с конца и видеть, где находятся концы. По сути, у вас есть буфер, скажем, 4096 байт, и вы обрабатываете последнюю строку этого буфера. Когда ваша обработка, которая должна перемещать по одной строке назад в этом буфере, доходит до начала буфера, вам нужно прочитать данные другого буфера из области перед первым читаемым буфером и продолжить обработку.

Этот подход обычно более сложен, потому что вам нужно обрабатывать такие вещи, как разбиение строк на два буфера, а длинные строки могут даже покрывать более двух буферов.

Однако это тот, который потребует наименьшего количества памяти, и для действительно больших файлов, возможно, также стоит сделать это, чтобы сначала не прочитать гигабайты информации.

Плюсы: Использует мало памяти, не требует, чтобы вы сначала читали весь файл
Минусы: Сложно реализовать и исправить во всех угловых случаях


На net, который показывает, как реализовать третий подход:

23
ответ дан 2 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: