номер строки в файле python
Тренировка: как в Python найти номер строки с заданным вхождением
Как в Python найти номер строки с заданным вхождением?
Как искать иголку в стоге сена мы выяснили, пришло время отыскать номер строки с заданным вхождением. А для того, чтобы поиски продвигались активнее, предлагаю поиграть в следователей — работа у них очень разноплановая: то преступника разыскивают, то код от сейфа.. Только представьте: следователи отыскали огромный текстовый файл, в котором тысячи строк. И лишь одна из них содержит фразу «я здесь ни при чем». А номер этой строки — недостающая часть кода от сейфа. Но мы же с вами — великие программисты! Мы сможем при помощи Python найти номер строки с заданными символами! Только составим предварительно ТЗ.
Кстати, а что, если в файле несколько строк с искомой фразой, и нам нужно вывести номера всех этих строк? Этот вариант мы не оставим без внимания и обязательно рассмотрим в этой статье в задаче №2. А сейчас приступим к решению первой задачи!
Задача №1: Поиск номера первой строки с заданным вхождением
Техническое задание:
Цель: вывести на экран номер строки, в которой содержится фраза: «я здесь ни при чем». Если таких строк несколько, выводим номер первой строки.
Порядок выполнения:
1. Инициализировать файл, в котором будем осуществлять поиск, а также определить искомую фразу.
2. Открыть заданный файл и произвести построчное считывание текста.
3. При считывании каждую строку файла проверять на вхождение фразы: «я здесь ни при чем». Если фраза в строке найдена, остановить построчное считывание и вывести номер строки на экран.
4. В заключение (исключительно в тренировочных целях!), оформим написанный код в функцию и осуществим ее вызов.
Для тренировки мы возьмем короткий файл — в нем легче протестировать работу нашего кода. Файл под названием «cats_fault.txt» следующего вида:
Решение:
1. Инициализируем переменные:
Для начала укажем Питону, какой файл он проглотит на обед и где этот файл находится:
В приведенной выше строчке кода нужно поменять «path_to_file» на путь к вашему файлу. Если вы новичок и не знаете, как задать путь к файлу, прочитайте инструкцию по ссылке: «Как задать путь к файлу».
Затем определим искомую фразу:
2. Открываем файл и построчно считываем данные:
Откроем файл с помощью конструкции with open и оформим построчное считывание из файла с помощью функции enumerate() так, чтобы номер строки считывался в переменную num_line, а сама строка — в переменную line:
Подробнее о построчном чтении файла можно прочитать по ссылке в статье «Построчное чтение файла в Python 3».
3. Проверяем строки на вхождение искомой фразы
Добавим в цикл for проверку каждой считанной строки на вхождение фразы required. Как только такая строка будет найдена, выведем ее номер и выйдем из цикла с помощью break:
Цель достигнута: номер строки найден!
Запускаем код и тестируем его работоспособность. Ура! Номер строки с фразой «я здесь ни при чем» выведен правильно! Обратите внимание, что по умолчанию, функция enumerate() производит нумерацию строк с нуля(не с единицы!), поэтому программа вывела на экран номер строки: 8.
Наведем красоту — поместим код в функцию!
Несмотря на то, что цель достигнута и программа успешно выводит номер строки с искомой фразой, предлагаю еще немного поработать. Давайте упакуем написанный код в функцию, а затем осуществим ее вызов с заданными параметрами: путем к файлу и искомой фразой. Выглядеть это будет так:
Как работает скрипт?
Описанная выше функция find_string_number содержит два параметра: путь к файлу path_to_file и искомую фразу required. После открытия файла, производим построчное считывание с помощью функции enumerate(), в результате чего номер текущей строки считывается в переменную num_line, а текст строки в переменную line. В цикле if проверяем вхождение фразы required в строку line. Если вхождение найдено, то возвращаем номер строки и выходим из цикла for. Если после проверки всех строк, вхождение не было выявлено, возвращаем сообщение о провале операции: ‘Ни одной строки с заданным содержанием не нашлось. Sorry. Это котик виноват’.
Немного хвалебной речи и приглашение к участию в решении следующей задачи:
Отлично! Мы справились с заданием и научились находить первую строку в файле с искомой фразой! Теперь, опираясь на написанный выше код, мы легко сможем решить похожую задачу. На этот раз предлагаю не ограничиваться номером первой найденной строки, а вывести номера всех строк, содержащих искомую фразу! Да, и фразу поменяем: будем искать подстроку, порочащую честь ушастого: «Это котик виноват».
Задача №2: Выводим номера всех строк, содержащих искомое вхождение
Техническое задание:
Цель: вывести на экран номера всех строк, в которых содержится фраза: «Это котик виноват».
Порядок выполнения:
1. Инициализировать файл, в котором будем осуществлять поиск, а также определить искомую фразу.
2. Открыть заданный файл и произвести построчное считывание текста. При считывании каждую строку файла проверять на вхождение фразы: «это котик виноват». Если фраза в строке найдена, добавить номер строки в список string_numbers. Вывести все элементы списка string_numbers на экран.
Решение:
1. Инициализация переменных
Прежде всего предлагаю определиться, куда мы будем складывать найденные номера строк? На мой взгляд, массив — вполне пригодная тара для такого хранения. Поэтому помимо пути к файлу и переменной для хранения искомой фразы, инициализируем список: string_numbers:
2. Открываем файл, построчно считываем содержимое файла и проверяем каждую строку на вхождение подстроки required. Если вхождение найдено, добавляем номер строки в конец списка string_numbers. После проверки всех строк, выводим список на экран:
В результате работы скрипт отыскал 2 строки с вхождением required и вывел их в виде списка на экран:
Финальное преображение кода: создаём функцию поиска номеров строк с заданным вхождением
А теперь, тренировки ради, предлагаю оформить написанный выше полезный код в красивую функцию под названием find_string_numbers() с двумя параметрами: file_path — содержит путь к файлу и required — содержит искомую фразу:
В данном варианте, после прохождения цикла for и проверки всех считанных строк, добавлена проверка на длину списка. Если длина списка больше нуля, это значит, что, как минимум, одна строка содержит искомую фразу и функция find_string_numbers() возвращает список с номерами строк. В противном случае, функция вернет сообщение «Ни одной строки с заданным содержанием не нашлось. Sorry. Это котик виноват».
Подводим итог
Как показывает практика, в Python приятно иметь дело с файлами. Если открывать файл с помощью конструкции with, то можно не беспокоиться о его закрытии — python сделает эту работу за нас. А функция enumerate() самостоятельно пронумерует все строки файла. Так что нам останется проявить лишь немного навыков работы с циклами, чтобы с позволения Python найти номер строки (или отыскать все строки) с заданным вхождением.
Построчное чтение файла в Python 3
Построчное чтение файла в Python 3
Когда используется построчное чтение файла?
Вы стали счастливым обладателем больших текстовых файлов, в которых заключены важные данные? Это здорово! Однако, теперь перед Вами стоит задача извлечения данных из файла по частям, желательно, по строкам. Ведь чтение большого файла и одномоментная загрузка его содержимого в оперативную память чревата жалобами компьютера на усталость и «замутненное сознание», что с 2020 года является непозволительной роскошью для рабочих лошадок. Поэтому предлагаю рассмотреть варианты, с помощью которых можно реализовать построчное чтение файла в Python 3 по следующему сценарию:
Сразу оговорюсь, что в Python открыть файл и прочитать данные из него можно несколькими способами. Для начала предлагаю взглянуть на наиболее оптимальный (исключительно на мой взгляд) вариант. Детальный разбор кода с рассмотрением других вариантов будет приведен чуть ниже, в следующем разделе статьи.
Оптимальный вариант для построчного чтения файла в Python:
1. Подготавливаем файл:
В качестве примера я буду использовать файл с именем «text.txt», состоящий из 5 строк следующего вида:
Файл «text.txt»
2. Создадим переменную для хранения пути к файлу:
Замените выражение в коде «путь к файлу» на актуальный путь к вашему файлу. Если у вас возникли сложности с определением пути к файлу, ознакомьтесь с инструкцией «Как задать путь к файлу в Python» и возвращайтесь — будем кодить построчное считывание файла!
3. Представленный ниже код откроет файл и выведет его содержимое на экран:
На экран выведется все содержимое файла:
Чтобы дополнить вывод номерами строк, добавим в приведенный выше код переменную num_line для хранения номера строки и функцию enumerate(file) для получения номера строки:
Теперь вывод выглядит так:
Приведенный выше способ вывода данных из файла — не единственный, существуют и другие рабочие варианты. Предлагаю произвести детальный разбор построчного чтения файла в Python для того, чтобы понять как работают используемые функции и ознакомиться с другими вариантами.
Детальный разбор построчного чтения файла в Python:
1. Первым делом мы открываем файл:
Для открытия файла мы использовали функцию open(), которая может принимать несколько аргументов. Однако, наиболее важными аргументами являются первые два:
Так как нам необходимо прочитать файл, то подходящий нам режим работы с файлом — «r», который является режимом по умолчанию. А значит, нет необходимости его указывать.
Для открытия файла мы воспользовались строкой вида:
Мы не случайно использовали ключевое слово width в качестве обертки при открытии файла — этот маленький фокус гарантирует нам автоматическое закрытие файла по завершению работы с ним.
Удобно, не правда ли? Если бы за мной так прибирали посуду после извлечения из нее содержимого… Однако, такая возможность в Python появилась только в версии 2.5. До этого закрытие файла нужно было номинировать функцией close(). И выглядело это так:
Такой вариант и по сей день имеет место быть, часто используется и отлично работает. Однако первый вариант имеет «защиту от дурака», чем лично для меня повышает свою привлекательность.
2. Считываем данные из открытого файла
Для чтения содержимого файла мы использовали цикл for. Каждая новая строка считывается в переменную line, а затем выводится на экране до тех пор, пока не будет достигнут символ окончания файла EOF:
Это довольно гибкий рабочий вариант. Однако, сложно обойти стороной «святую троицу» Питоновских методов, созданных для работы с файлами:
1. Метод read(file)
Метод read(file) — считывает все данные из файла file и возвращает их в виде одной текстовой строки. Этот вариант подходит для файлов небольшого размера:
Программа выведет на экран:
2. Метод readline()
Метод readline() считывает одну строку. Для того, чтобы вывести содержимое всего файла, необходимо зациклить построчный вывод:
Результат работы кода:
3. Метод readlines()
Метод readlines() возвращает содержимое файла в виде списка строк:
Результат работы кода:
Используя метод readlines() можно легко получить доступ к нужной строке, допустим к строке с индексом 3:
Так как Python нумерует строки с 0, то 3-й индекс в моем файле принадлежит четвертой строке
Таким образом, мы научились выполнять построчное чтение файла в Python несколькими различными способами. Вы можете использовать любой из рассмотренных вариантов, в зависимости от Ваших предпочтений и особенностей задачи. Интересных Вам файлов и красивых строк! 😉
Отладка Python: получить имя файла и номер строки, из которой вызывается функция?
В настоящее время я создаю довольно сложную систему на Python, и при отладке я часто помещаю простые операторы печати в несколько скриптов. Чтобы сохранить обзор, я также часто хочу распечатать имя файла и номер строки, где находится оператор печати. Конечно, я могу сделать это вручную или с помощью чего-то вроде этого:
который печатает что-то вроде:
Чтобы сделать это проще, я хочу иметь возможность сделать что-то вроде:
Поэтому я поместил его в функцию где-то и попытался сделать:
к сожалению, я получаю:
Он печатает имя файла и номер строки, в которой я определил функцию, вместо строки, в которой я вызываю debuginfo (). Это очевидно, потому что код находится в файле debugutil.py.
Итак, мой вопрос на самом деле: Как я могу получить имя файла и номер строки, из которой вызывается эта функция debuginfo ()? Все советы приветствуются!
3 ответа
Выход
Если вы поместили свой код трассировки в другую функцию и вызвали его из основного кода, то вам нужно убедиться, что вы получаете информацию о стеке от деда, а не от родителя или самой функции трассировки
Ниже приведен пример трехуровневой глубокой системы, чтобы уточнить, что я имею в виду. Моя основная функция вызывает функцию трассировки, которая вызывает еще одну функцию для выполнения работы.
Это напечатает что-то вроде:
Функция trace_library_do () вверху является примером того, что вы можете поместить в библиотеку, а затем вызвать из других функций трассировки. Значение относительной глубины определяет, какая запись в стеке Python будет напечатана.
Я уверен, что кто-то возразит, что я использую внутренние поля с данными, возвращаемыми структурами проверки, так как вполне могут быть функции доступа, которые делают то же самое для вас. Но я нашел их, пройдя через этот тип кода в отладчике Python, и они работают, по крайней мере, здесь. Я использую Python 2.7.12, ваши результаты могут быть очень, если вы используете другую версию.
В любом случае, я настоятельно рекомендую вам импортировать проверяющий код в какой-то собственный код Python и посмотреть, что он может вам предоставить, особенно если вы можете выполнить пошаговый просмотр кода в хорошем отладчике Python. Вы узнаете много нового о том, как работает python, и узнаете обо всех преимуществах языка и о том, что происходит за кулисами, чтобы сделать это возможным.
Просто поместите код, который вы разместили в функцию:
, а затем используйте его как хотите:
Я рекомендую вам поместить эту функцию в отдельный модуль, чтобы вы могли использовать ее каждый раз, когда вам это нужно.
Отладка Python: получить имя файла и номер строки, из которой вызывается функция?
В настоящее время я создаю довольно сложную систему на Python, и когда я отлаживаю, я часто помещаю простые операторы печати в несколько скриптов. Чтобы сохранить обзор, я также часто хочу распечатать имя файла и номер строки, где находится оператор печати. Конечно, я могу сделать это вручную или с помощью чего-то вроде этого:
Который печатает что-то вроде:
Чтобы сделать это проще, я хочу иметь возможность сделать что-то вроде:
Итак, я поместил это в функцию где-то и попытался сделать:
К сожалению, я получаю:
Он выводит имя файла и номер строки, в которой я определил функцию, вместо строки, в которой я вызываю debuginfo (). Это очевидно, потому что код находится в файле debugutil.py.
Итак, мой вопрос на самом деле: Как я могу получить имя файла и номер строки, из которой вызывается эта функция debuginfo ()? Все советы приветствуются!
4 ответа
Функция inspect.stack() возвращает список записи фреймов, начиная с вызывающего абонента и выходя, который вы можно использовать для получения необходимой информации:
Если вы помещаете свой код трассировки в другую функцию и вызываете его из основного кода, вам необходимо убедиться, что вы получаете информацию о стеке от деда, а не от родителя или самой функции трассировки.
Ниже приведен пример трехуровневой глубокой системы, чтобы уточнить, что я имею в виду. Моя основная функция вызывает функцию трассировки, которая вызывает еще одну функцию для выполнения работы.
Это напечатает что-то вроде:
Функция trace_library_do () вверху является примером того, что вы можете поместить в библиотеку, а затем вызвать из других функций трассировки. Значение относительной глубины определяет, какая запись в стеке Python будет напечатана.
Я уверен, что кто-то возразит, что я использую внутренние поля с данными, возвращаемыми структурами проверки, так как вполне могут быть функции доступа, которые делают то же самое для вас. Но я нашел их, пройдя через этот тип кода в отладчике Python, и они работают, по крайней мере, здесь. Я использую Python 2.7.12, ваши результаты могут быть очень, если вы используете другую версию.
В любом случае, я настоятельно рекомендую вам импортировать проверяющий код в какой-то собственный код Python и посмотреть, что он может вам предоставить, особенно если вы можете пошагово пройти код в хорошем отладчике Python. Вы узнаете много нового о том, как работает python, и узнаете как о преимуществах языка, так и о том, что происходит за кулисами, чтобы сделать это возможным.
Просто поместите код, который вы разместили в функцию:
А затем используйте его как хотите:
Я рекомендую вам поместить эту функцию в отдельный модуль, чтобы вы могли использовать ее каждый раз, когда вам это нужно.
Обнаружил этот вопрос для некоторой связанной проблемы, но я хотел больше подробностей о выполнении (и я не хотел устанавливать весь пакет графа вызовов).
Как считать строки из файла начав с определенного номера строки?
Как осуществить последовательное чтение строк из файла, начав с определенного номера строки?
4 ответа 4
Для улучшения производительности для больших файлов можно попробовать использовать mmap и искать индекс вхождения b’\n’ (не тестировано):
Считать строки из файла с определённого номера строки можно с помощью следующего кода
Вот еще один пример, как по мне очень наглядный и простой
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.4.40368
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.