Как найти номер строки в файле Python

Обновлено: 21.11.2024

Python должен гарантировать, что при включении трассировки «линейные» события трассировки генерируются для всех строк исполняемого кода и только для исполняемых строк кода.

Атрибут f_lineno объектов фрейма всегда должен содержать ожидаемый номер строки. Во время выполнения кадра ожидаемый номер строки — это номер строки исполняемого в данный момент исходного кода. После того, как кадр завершится либо путем возврата, либо путем возбуждения исключения, ожидаемый номер строки — это номер строки последней выполненной строки исходного кода.

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

Мотивация

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

Текущая реализация в основном делает это, но в некоторых случаях дает сбой. Это требует обходных путей в инструментах и ​​создает неудобства для альтернативных реализаций Python.

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

Обоснование

Чтобы гарантировать, что события строки генерируются, когда ожидается, атрибут co_lnotab в его нынешнем виде больше не может быть источником достоверной информации о номере строки.

Вместо того, чтобы пытаться исправить атрибут co_lnotab, будет добавлен новый метод co_lines(), который возвращает итератор по смещениям байт-кода и строкам исходного кода.

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

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

Спецификация

События линии и атрибут f_lineno должны действовать так, как ожидал бы опытный пользователь Python в всех случаях.

Отслеживание

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

Этот PEP распространяется только на линейные события.

Если трассировка включена, линейные события будут генерироваться, когда:

  • Достигнута новая строка исходного кода.
  • Происходит переход назад, даже если он переходит на ту же строку, что может произойти при включении списка.

Кроме того, события строки никогда не будут генерироваться для строк исходного кода, которые не выполняются.

Что считается кодом для целей отслеживания

Все выражения и части выражений считаются исполняемым кодом.

Как правило, все операторы также считаются исполняемым кодом. Однако, когда инструкция распределена по нескольким строкам, мы должны учитывать, какие части инструкции считаются исполняемым кодом.

Утверждения состоят из ключевых слов и выражений. Не все ключевые слова имеют прямое влияние во время выполнения, поэтому не все ключевые слова считаются исполняемым кодом. Например, else является необходимой частью оператора if, но с ним не связаны никакие эффекты времени выполнения.

В целях отслеживания следующие ключевые слова не будут считаться исполняемым кодом:

В этой статье мы обсудим, как искать одну или несколько строк в файле и получать все совпадающие строки вместе с их номерами строк.

Проверить, существует ли строка в файле

Чтобы проверить, существует ли данная строка в файле или нет, мы создали функцию,

Он принимает путь к файлу и строку в качестве аргументов. Затем перебирает каждую строку в файле одну за другой и для каждой строки проверяет, содержит ли она заданную строку или нет. Если строка содержит заданную строку, то вернуть True. В то время как если ни одна строка в файле не содержит заданную строку, возвращается False.

Содержимое файла «sample.txt»:

Проверим, содержит ли этот файл строку «is» или нет,

Поскольку файл содержит «есть», функция check_if_string_in_file() возвращает значение True.

Здесь мы узнаем, содержит файл заданную строку или нет. Но что, если мы хотим знать все точные вхождения строки в файл, такие как строки и номера строк. Давайте посмотрим, как это сделать,

Найти строку в файле и получить все строки, содержащие строку, вместе с номерами строк

мы создали функцию для получения всех строк и номеров строк, содержащих заданную строку,

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

Как это сработало?

Алгоритм следующий:

  • Принять аргументы — путь к файлу и строка для поиска.
  • Создайте пустой список кортежей.
  • Открыть файл по указанному пути в режиме только для чтения.
  • Перебирает каждую строку в файле одну за другой.
    • Для каждой строки проверьте, содержит ли она заданную строку или нет.
      • Если строка содержит заданную строку,
        • Создает кортеж из номера строки и строки и добавляет его в список кортежей.

        Предположим, у нас есть файл «sample.txt» и его содержимое:

        Давайте получим всю строку вместе с номерами строк, которые содержат слово «есть»,

        Всего было две строки, содержащие строку «is», и эта функция вернула эти строки вместе с их номерами. Теперь предположим, что вместо поиска одной строки мы хотим искать несколько строк в файле. Давайте посмотрим, как это сделать,

        Поиск нескольких строк в файле и получение строк, содержащих строку вместе с номерами строк

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

        Давайте воспользуемся этой функцией,

        Содержимое файла ‘sample.txt’:

        Давайте получим все строки вместе с их номерами строк, которые либо содержат слово «есть» или «что»,

        Полный пример выглядит следующим образом:

        Вывод:

        Учебники по Pandas – изучите анализ данных с помощью Python

        Вы хотите сделать карьеру в области Data Science с помощью Python?

        Наука о данных — это будущее, и оно уже наступило. На сегодняшний день специалисты по данным являются самыми востребованными профессионалами. Чтобы стать хорошим Data Scientist или сменить профессию в Data Science, нужно обладать нужным набором навыков. Мы составили список лучших профессиональных сертификатов в области науки о данных с помощью Python. Эти курсы научат вас инструментам программирования для науки о данных, таким как Pandas, NumPy, Matplotlib, Seaborn, и тому, как использовать эти библиотеки для реализации моделей машинного обучения.

        Ознакомьтесь с подробным обзором лучшего профессионального сертификата по науке о данных с Python.

        Помните, что наука о данных требует большого терпения, настойчивости и практики. Итак, начните учиться сегодня.

        Присоединяйтесь к сообществу разработчиков Python в LinkedIn

        Похожие записи

        Вставить элемент в начало массива NumPy

        Как добавить столбцы в массив NumPy в Python

        Как объединить массивы NumPy в Python?

        Добавить строку в массив NumPy в Python

        Добавить элементы в конец массива в Python

        Как удалить столбцы из массива NumPy

        Как удалить строки из массива NumPy

        Удалить последний элемент из массива NumPy в Python

        Удалить первый элемент из массива NumPy в Python

        Проверьте, является ли двумерный массив NumPy или матрица симметричным

        Редактировать значения ячеек в CSV-файлах с помощью Pandas в Python

        Сортировка массива NumPy в порядке убывания в Python

        Преобразование списка в набор в Python

        Добавление двух элементов списка в Python

        Добавление одного списка к другому списку в Python

        Удалить дубликаты из массива NumPy в Python

        Проверить, существует ли столбец в Pandas DataFrame

        Проверить, равны ли два массива NumPy в Python

        Pandas: проверьте, все ли значения в столбце равны нулю

        Проверить, все ли значения в столбце являются NaN в Pandas

        1 мысль о «Python: поиск строк в файле и получение номеров строк, содержащих строку»

        А если нужно напечатать только строки справа от строки поиска?

        Оставить комментарий Отменить ответ

        Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.

        Реклама

        Реклама

        Последние сообщения

        Учебники по Python

        Что-то ищу

        Учебники по C++/C++11

        Условия использования

        Условия и политика

        Учебники по Python

        Избранные сайты

        Отказ от ответственности

        Условия и политика

        Авторское право © 2022 thisPointer

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

        Техническое хранение или доступ необходимы для законных целей хранения настроек, которые не запрашиваются подписчиком или пользователем.

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

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

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

        Техническое хранение или доступ необходимы для законных целей хранения настроек, которые не запрашиваются подписчиком или пользователем.

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

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

        Получите полный доступ к Python Cookbook и более чем 60 тысячам других игр, воспользовавшись бесплатной 10-дневной пробной версией O'Reilly.

        Есть также прямые онлайн-мероприятия, интерактивный контент, материалы для подготовки к сертификации и многое другое.

        Источник: Лютер Блиссет

        Проблема

        Вам нужно вычислить количество строк в файле.

        Решение

        Самый простой подход для файлов разумного размера – прочитать файл как список строк, чтобы количество строк равнялось длине списка. Если путь к файлу находится в строке, привязанной к переменной thefilepath, это просто:

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

        Вот несколько хитрый вариант, если разделителем строки является '\n' (или содержит '\n' в качестве подстроки, как это происходит в Windows):

        Без аргумента 'rb' для открытия это будет работать где угодно, но производительность может сильно снизиться на платформах Windows или Macintosh.

        Обсуждение

        Если у вас есть внешняя программа, которая считает строки в файле, например, wc -l на Unix-подобных платформах, вы, конечно, можете использовать ее (например, через os.popen()). Однако, как правило, проще, быстрее и удобнее выполнять подсчет строк в вашей программе. Вы можете положиться на то, что почти все текстовые файлы имеют разумный размер, так что чтение всего файла в память возможно сразу. Для всех таких обычных файлов длина результата readlines дает вам количество строк самым простым способом.

        Если размер файла превышает доступную память (скажем, несколько сотен мегабайт на обычном ПК сегодня), самое простое решение может работать медленно, поскольку операционная система изо всех сил пытается разместить содержимое файла в виртуальной памяти. Это может даже дать сбой, когда пространство подкачки исчерпано и виртуальная память уже не может помочь. На обычном ПК с 256 МБ ОЗУ и практически неограниченным дисковым пространством следует ожидать серьезных проблем при попытке чтения в память файлов размером, скажем, 1 или 2 ГБ, в зависимости от вашей операционной системы (некоторые операционные системы гораздо более уязвимы, чем другие, в решении проблем с виртуальной памятью в таких условиях чрезмерной нагрузки). В этом случае метод файловых объектов xreadlines, представленный в Python 2.1, в целом является хорошим способом обработки текстовых файлов построчно. В Python 2.2 вы можете сделать еще лучше с точки зрения ясности и скорости, зациклив непосредственно на файловом объекте:

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

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

        Однако помните, что в большинстве случаев производительность не имеет большого значения. Когда это имеет значение, временной сток может быть не таким, как подсказывает вам ваша интуиция, поэтому вам никогда не следует доверять своей интуиции в этом вопросе — вместо этого всегда сравните и измеряйте.Например, я взял типичный файл системного журнала Unix среднего размера, чуть более 18 МБ текста в 230 000 строк:

        и я настроил следующий тестовый фреймворк Bench.py ​​:

        Как видите, разница в производительности почти не имеет значения: разница в 10 % или около того в одной вспомогательной задаче — это то, что ваши пользователи даже не заметят. Тем не менее, самый быстрый подход (для моих конкретных обстоятельств, дешевый, но совсем новый ПК с популярным дистрибутивом Linux, а также этот конкретный тест) — это скромный метод цикла на каждой строке, а самый медленный — амбициозный метод. который подсчитывает терминаторы строк по частям. На практике, если мне не приходилось беспокоиться о файлах размером во многие сотни мегабайт, я всегда использовал самый простой подход (то есть первый из представленных в этом рецепте).

        См. также

        Раздел Справочник по библиотеке, посвященный файловым объектам и модулю времени; Поваренная книга Perl Рецепт 8.2.

        Получите Python Cookbook прямо сейчас с онлайн-обучением O’Reilly.

        Члены O’Reilly проходят онлайн-обучение в режиме реального времени, а также получают книги, видео и цифровой контент от более чем 200 издателей.

        Распространенной задачей в программировании является открытие файла и анализ его содержимого. Что вы делаете, когда файл, который вы пытаетесь обработать, довольно большой, например, несколько ГБ данных или больше? Решение этой проблемы состоит в том, чтобы читать фрагменты файла за раз, обрабатывать его, а затем освобождать его из памяти, чтобы вы могли обрабатывать другой фрагмент, пока не будет обработан весь массивный файл. Хотя вы сами определяете подходящий размер фрагментов данных, которые вы обрабатываете, для многих приложений удобно обрабатывать файл по одной строке за раз.

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

        Базовый файловый ввод-вывод в Python

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

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

        Как показано выше, функция open() принимает несколько аргументов. Мы сосредоточимся на двух аргументах, первый из которых представляет собой позиционный строковый параметр, представляющий путь к файлу, который вы хотите открыть. Второй (необязательный) параметр также является строкой и указывает режим взаимодействия, который вы собираетесь использовать с файловым объектом, возвращаемым вызовом функции. Наиболее распространенные режимы перечислены в таблице ниже, по умолчанию для чтения используется 'r':

        Режим Описание
        r Открыть для чтения обычного текста
        w Открыть для записи обычного текста
        a Открыть существующий файл для добавления простого текста
        rb Открыть для чтения двоичных данных
        wb Открыть для записи двоичных данных

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

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

        Хотя вы всегда можете помнить о вызове close() для файлового объекта, существует альтернативный и более элегантный способ открыть файловый объект и убедиться, что интерпретатор Python выполняет очистку после его использования:

        Просто используя ключевое слово with (появившееся в Python 2.5) в коде, который мы используем для открытия файлового объекта, Python сделает что-то похожее на следующий код. Это гарантирует, что независимо от того, какой файловый объект будет закрыт после использования:

        Подходит любой из этих двух методов, при этом первый пример более Pythonic.

        Объект файла, возвращаемый функцией open(), имеет три общих явных метода (read(), readline() и readlines()) для чтения данных. Метод read() считывает все данные в одну строку. Это полезно для небольших файлов, где вы хотели бы выполнять манипуляции с текстом во всем файле. Затем есть readline() , который является полезным способом чтения только отдельных строк, постепенно увеличивая количество за раз, и возвращать их в виде строк. Последний явный метод readlines() прочитает все строки файла и вернет их в виде списка строк.

        Построчное чтение файла в Python с помощью readline()

        Начнем с метода readline(), который считывает одну строку, что потребует от нас использования счетчика и его увеличения:

        Этот фрагмент кода открывает файловый объект, ссылка на который хранится в fp , а затем считывает строки по одной, итеративно вызывая readline() для этого файлового объекта в цикле while. Затем он просто выводит строку на консоль.

        Запустив этот код, вы должны увидеть примерно следующее:

        Однако этот подход грубый и явный. Наверняка не очень Pythonic. Мы можем использовать метод readlines(), чтобы сделать этот код более кратким.

        Построчное чтение файла с помощью readlines()

        Метод readlines() считывает все строки и сохраняет их в List . Затем мы можем перебрать этот список и с помощью enumerate() создать индекс для каждой строки для нашего удобства:

        В результате:

        Бесплатная электронная книга: Git Essentials

        Ознакомьтесь с нашим практическим руководством по изучению Git, включающим передовые практики, общепринятые стандарты и памятку. Перестаньте гуглить команды Git и на самом деле изучите их!

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

        Чтение файла построчно с помощью цикла for – наиболее подход Pythonic

        Возвращенный файл сам по себе является итерируемым. Нам вообще не нужно извлекать строки через readlines() — мы можем перебрать сам возвращаемый объект. Это также упрощает его перечисление(), чтобы мы могли писать номер строки в каждом операторе print().

        Это самый короткий, самый питоновский подход к решению проблемы, и этот подход нравится большинству:

        В результате:

        Здесь мы воспользуемся встроенными функциями Python, которые позволяют нам легко выполнять итерацию по итерируемому объекту, просто используя цикл for. Если вы хотите узнать больше о встроенных функциях Python для итерации объектов, мы предоставим вам информацию:

        Применения построчного чтения файлов

        Как это можно использовать на практике? Большинство приложений НЛП имеют дело с большими объемами данных. В большинстве случаев нецелесообразно считывать весь корпус в память. Хотя это и рудиментарно, вы можете написать решение с нуля для подсчета частоты определенных слов без использования каких-либо внешних библиотек. Давайте напишем простой скрипт, который загружает файл, читает его построчно и подсчитывает частоту слов, печатая 10 наиболее часто встречающихся слов и количество их вхождений:

        Сценарий использует модуль os, чтобы убедиться, что файл, который мы пытаемся прочитать, действительно существует. Если да, то он читается построчно, и каждая строка передается в функцию record_word_cnt(). Он разграничивает пробелы между словами и добавляет слово в словарь — bag_of_words. Как только все строки записаны в словарь, мы упорядочиваем их с помощью функции order_bag_of_words(), которая возвращает список кортежей в формате (word, word_count), отсортированных по количеству слов.

        Наконец, мы печатаем десять самых распространенных слов.

        Обычно для этого создается модель Bag of Words с использованием таких библиотек, как NLTK, однако этой реализации будет достаточно. Запустим скрипт и предоставим ему наш Iliad.txt:

        В результате:

        Если вы хотите узнать больше о НЛП, у нас есть серия руководств по различным задачам: Обработка естественного языка в Python.

        Заключение

        В этой статье мы рассмотрели несколько способов построчного чтения файла в Python, а также создали элементарную модель Bag of Words для расчета частоты слов в файле. данный файл.

        Читайте также: