Конец файла Python
EOF означает End Of File . Это момент в программе, когда пользователь больше не может читать данные. Это означает, что программа читает весь файл до конца. Кроме того, при достижении EOF или конца файла в качестве вывода возвращаются пустые строки. Итак, пользователю необходимо знать, находится ли файл в его EOF.
Please enable JavaScript
В этом руководстве представлены различные способы узнать, находится ли файл в его EOF в Python.
Используйте file.read() , чтобы найти конец файла в Python
Метод file.read() — это встроенная функция Python, используемая для чтения содержимого данного файла. Если метод file.read() возвращает пустую строку в качестве вывода, это означает, что файл достиг своего EOF.
Обратите внимание, что когда мы вызываем функцию open() для открытия файла при запуске программы, мы используем «r» как режим только для чтения файла. Наконец, мы используем условный оператор if , чтобы проверить, что возвращаемый результат — это пустая строка.
Используйте метод readline() с циклом while для поиска конца файла в Python
Метод file.readline() — еще одна встроенная функция Python для чтения одной полной строки текстового файла.
Цикл while в Python — это цикл, который повторяет данное условие в блоке кода до тех пор, пока данное условие не станет истинным. Этот цикл используется, когда количество итераций заранее не известно.
Использование цикла while с методом readline() помогает многократно читать строки в данном текстовом файле.
Цикл while прекратит итерацию, когда в текстовом файле не останется текста для чтения методом readline() .
Использование оператора Walrus для поиска конца файла в Python
Оператор Walrus — новый оператор в Python 3.8. Обозначается := . Этот оператор по сути является оператором присваивания, который используется для присвоения значений True и их немедленной печати.
Здесь значения True — это символы, которые функция read() будет читать из текстового файла. Это означает, что оператор моржа прекратит печать после завершения файла.
чтение с конца файла на python
понятия не имею как к этому процессу подступиться, особенно учитывая что на баше это 2 строчки:


Читаешь последние n байт с конца, парсишь, если не хватает, читаешь дальше. Что сложного?

Не умею в питон, но, полюбому там есть возможность сикнуть файл в конец, а затем вычитывать его кусочками ища нужную метку чтобы остановиться.

Там есть seek() функция.

А еще можешь выполнить из питона этот вот твой bash-код.
Поправьте если не прав, но в Python в коробке нет потокового backward stream reader или как его правильно назвать, так что:
1. Использовать supbrocess, что бы там гонять tac
2. Искать готовую реализацю bacward reader-а (с буфером и т.д.)
3. Писать его самому
4. Читать файл полностью в память и делать что-то вроде for line in reversed(file.readlines()): .


Из коробки нет, но это достаточно популярная задачка на собеседовании :).
У тебя там grep читает весь файл целиком.
Короче, ты реши действительно у тебе так важна скорость что прочитать файлы целиком это проблема. Потому что, скажем, раз в час распарсить лог на 100метров это НЕ проблема.
Если всё же проблема то читай чанками с конца. Готовые решения вполне гуглятся. Вот, например, тут есть итератор которые строки в обратном порядки из файла достаёт: http://stackoverflow.com/questions/260273/most-efficient-way-to-search-the-la. . Ящитаю, это отличное решение.

Ну башевский этот код будет читать весь файл. Греп весь же прочитает. Можно так же. Делаешь пустой список. Открываешь файл. Читаешь по одной строке (readline). Если строка — метка, то список очищаешь (делаешь пустым []), иначе, вносишь строку в список. При EOF у тебя в списке будут все строки после последней метки.
Если важно именно не читать весь файл (греп будет это делать), то открываешь файл, сикаешь на -1024 от конца, читаешь. Метка есть? Сплитаешь по ней, берёшь конец. Нет? Сикаешь на -2048 от конца, и так далее. Ну цифры можно примерно прикинуть из того, сколько обычно инфы в одной такой секции.
Но учитывая, что файл может быть всего-то 100мб, можно и весь прочитать в строку, да сплитнуть по меткам.

У тебя там grep читает весь файл целиком.
tac в большинстве случаев читает файл нецеликом, может быть и целиком, но лишь до момента пока grep не найдет что надо, и head -n1 обрубит пайп.
еще конечно tail перечитает файл, но примерно также как и tac+grep+head.
раз в час распарсить лог на 100метров это НЕ проблема.
у меня три сотни этих логов, и как правило парсинг должен запускаться практически одновременно раза 3-4 в час, не охота погибнуть от руки oomkiller-а.

Уппс, не заметил, пардон.

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

Ну что-то типа такого. Переходим в конец, откатываемся «вверх» на 1024, читаем, находим все последнюю «метку» в прочитанном — с нее и будет наша нужная информация. Это при условии, что мы за один раз прочитаем хотя бы один кусок
1) Переделать все и читать вообще построчно(что правильнее)
2) Просто увеличить число считанных байт.
Плюс как уже советовали можно ввести метку о не формате.

Вот, например, тут есть итератор которые строки в обратном порядки из файла достаёт: http://stackoverflow.com/questions/260273/most-efficient-way-to-search-the-la. . Ящитаю, это отличное решение.
оказывается уже смотрел его, но что то не понял как оно работает, буду думать.

Оно читает файл в обратном направлении в буфер чанками. Буфер зовётся part. Как только доходит до ‘\n’ оно переворачивает буфер (part[::-1] тоже самое что и reversed(part)).
Как только дошли до конца текущего чанка мы считываем следующий. При этом буфер не сбрасывается.
Кстати, можешь работать с файлами через mmap как с массивом char. Тогда всё будет ещё очевиднее.
Как прочитать последнюю строку файла в Python?
Первое требование . Я хочу прочитать последнюю строку файла и присвоить последнее значение переменной в Python.
Второе требование —
Вот мой пример файла.
Из этого файла я хочу прочитать содержимое, например filename.txt , которое будет после <context:property-placeholder location= . . И хочу присвоить это значение переменной в python.
8 ответов
Простое решение, которое не требует сохранения всего файла в памяти (например, с помощью file.readlines() или аналогичной конструкции):
Для больших файлов было бы более эффективно искать до конца файла и двигаться назад, чтобы найти новую строку, например:
Обратите внимание, что файл должен быть открыт в двоичном режиме, иначе будет невозможно искать с конца.
Почему бы вам просто не прочитать все строки и не сохранить последнюю строку в переменной?
В системах, где есть команда tail , вы можете использовать tail , что для больших файлов избавит вас от необходимости читать файл целиком.
Примечание: команда decode() требуется только для python3
Подойдет для python2.x
Вы можете прочитать и отредактировать всю строку, сделав что-то вроде:
Он не просто спрашивает, как читать строки в файле или как читать последнюю строку в переменной. Он также спрашивает, как разобрать подстроку из последней строки, содержащую его целевое значение.
Вот один способ. Это самый короткий путь? Нет, но если вы не знаете, как нарезать строки, вам следует начать с изучения каждой встроенной функции, используемой здесь. Этот код получит то, что вы хотите:
Вывод команды печати должен выглядеть так:
Темы, затронутые здесь:
- Чтение текстовых файлов
- Составление списка Python строк из содержимого, чтобы упростить получение последней строки с использованием индекса len(List) -1 с отсчетом от нуля.
- Использование find для получения позиций индекса строки внутри строки
- Использование slice для получения подстрок
Все эти темы находятся в документации Python — здесь нет ничего лишнего, и импорт не требуется для использования встроенных функций, которые здесь использовались.
Обобщается для чтения строки с N-й до последней
Как говорили многие другие люди, для больших файлов любой подход, не стремящийся к концу или иным образом не начинающийся с конца файла, очень неэффективен. Тем не менее, подход к поиску верхнего ответа великолепен. Если кто-то еще ищет решение, которое вместо этого читает от n до последней строки файла, вот одно, которое я написал. Также очень быстро и эффективно для больших файлов (взял под мс для файла 7гб по сети).
Выполните проверку размера и выполните поиск назад на определенное количество байтов от конца файла, если он содержит по крайней мере такое количество байтов:
Как читать строки из файла в Python, начиная с конца
Мне нужно знать, как читать строки из файла в python, чтобы я сначала прочитал последнюю строку и продолжаю так, пока курсор не достигнет начала файла. Есть идеи?
5 ответов
Общий подход к этой проблеме, считывая текстовый файл в обратном порядке, по-разному, может быть решен, по крайней мере, тремя способами.
Общая проблема заключается в том, что, поскольку каждая строка может иметь разную длину, вы не можете заранее знать, где каждая строка начинается в файле, а также сколько из них есть. Это означает, что вам нужно применить некоторую логику к проблеме.
Общий подход # 1: чтение всего файла в память
При таком подходе вы просто читаете весь файл в памяти, в некоторой структуре данных, которая впоследствии позволяет обрабатывать список строк в обратном порядке. Это может быть стек, двусвязный список или даже массив.
Плюсы: Действительно легко реализовать (возможно, встроенный в Python для всех, кого я знаю)
Минусы: Использует много памяти, может потребоваться некоторое время для чтения больших файлов
Общий подход # 2: Прочитайте весь файл, сохраните позицию строк
При таком подходе вы также читаете весь файл один раз, но вместо хранения всего файла (всего текста) в памяти вы сохраняете только двоичные позиции внутри файла, где начиналась каждая строка. Вы можете сохранить эти позиции в аналогичной структуре данных, как та, которая хранит строки в первом подходе.
Вы хотите прочитать строку X, вам нужно перечитать строку из файла, начиная с позиции, которую вы сохранили для начала этой строки.
Плюсы: Почти так же легко реализовать как первый подход
Минусы: может потребоваться некоторое время для чтения больших файлов
Общий подход №3: Прочтите файл в обратном порядке и «выберите его»
При таком подходе вы будете читать фрагмент файла или аналогичный, с конца, и посмотреть, где находятся концы. У вас в основном есть буфер, скажем, 4096 байт, и обрабатывать последнюю строку этого буфера. Когда ваша обработка, которая должна перемещать одну строку за раз назад в этом буфере, подходит к началу буфера, вам нужно прочитать другую ценность данных в буфере, от области до первого прочитанного буфера и продолжить обработку.
Этот подход, как правило, более сложный, потому что вам нужно обрабатывать такие вещи, как линии, разбитые на два буфера, а длинные строки могут даже охватывать более двух буферов.
Это, однако, тот, который потребует наименьшего объема памяти и для действительно больших файлов, также может быть полезно сделать это, чтобы сначала не считывать гигабайты информации.
Плюсы: Использует небольшую память, не требует, чтобы вы сначала прочитали весь файл
Минусы: Многое трудно реализовать и получить право на все угловые случаи
В сети есть множество ссылок, в которых показано, как сделать третий подход: