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 несколькими различными способами. Вы можете использовать любой из рассмотренных вариантов, в зависимости от Ваших предпочтений и особенностей задачи. Интересных Вам файлов и красивых строк! 😉
Пронумеровать строки в файле
Есть текстовый файл, в котором однотипные строки без нумерации.
Как нумеровать строки последовательно?
Пробую так, выдаёт ошибку (пример нашёл в интернете):
4 ответа 4
Чтобы по месту файл изменить, добавив номер строки к каждой строке (версия nl утилиты, которая по месту изменения выполняет):
Если в итоге необходимо получить файл с аналогичным содержанием и пронумерованными строками можно попробовать такой вариант:
Так же эту задачу можно решить при помощи контекстного менеджера разработанного Мартином Питерсом для перезаписи файла на месте (Easy in-place file rewriting).
Проблема в лишнем отступе для цикла и том, что вы забыли вывести переменную счетчик.
Всё ещё ищете ответ? Посмотрите другие вопросы с метками python строки текст или задайте свой вопрос.
Связанные
Похожие
Подписаться на ленту
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2021 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2021.10.8.40416
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Отладка Python: получить имя файла и номер строки, из которой вызывается функция?
В настоящее время я создаю довольно сложную систему на Python, и когда я отлаживаю, я часто помещаю простые операторы печати в несколько скриптов. Чтобы сохранить обзор, я также часто хочу распечатать имя файла и номер строки, где находится оператор печати. Конечно, я могу сделать это вручную или с помощью чего-то вроде этого:
Который печатает что-то вроде:
Чтобы сделать это проще, я хочу иметь возможность сделать что-то вроде:
Итак, я поместил это в функцию где-то и попытался сделать:
К сожалению, я получаю:
Он выводит имя файла и номер строки, в которой я определил функцию, вместо строки, в которой я вызываю debuginfo (). Это очевидно, потому что код находится в файле debugutil.py.
Итак, мой вопрос на самом деле: Как я могу получить имя файла и номер строки, из которой вызывается эта функция debuginfo ()? Все советы приветствуются!
4 ответа
Функция inspect.stack() возвращает список записи фреймов, начиная с вызывающего абонента и выходя, который вы можно использовать для получения необходимой информации:
Если вы помещаете свой код трассировки в другую функцию и вызываете его из основного кода, вам необходимо убедиться, что вы получаете информацию о стеке от деда, а не от родителя или самой функции трассировки.
Ниже приведен пример трехуровневой глубокой системы, чтобы уточнить, что я имею в виду. Моя основная функция вызывает функцию трассировки, которая вызывает еще одну функцию для выполнения работы.
Это напечатает что-то вроде:
Функция trace_library_do () вверху является примером того, что вы можете поместить в библиотеку, а затем вызвать из других функций трассировки. Значение относительной глубины определяет, какая запись в стеке Python будет напечатана.
Я уверен, что кто-то возразит, что я использую внутренние поля с данными, возвращаемыми структурами проверки, так как вполне могут быть функции доступа, которые делают то же самое для вас. Но я нашел их, пройдя через этот тип кода в отладчике Python, и они работают, по крайней мере, здесь. Я использую Python 2.7.12, ваши результаты могут быть очень, если вы используете другую версию.
В любом случае, я настоятельно рекомендую вам импортировать проверяющий код в какой-то собственный код Python и посмотреть, что он может вам предоставить, особенно если вы можете пошагово пройти код в хорошем отладчике Python. Вы узнаете много нового о том, как работает 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 начинается с вызова специальной функции open, которая принимает в качестве параметров путь к объекту на компьютере и режим обработки. Путь к документу можно указать как абсолютный (адрес расположения на жестком диске ПК), так и как относительный (координаты относительно папки проекта). Выбирая нужный режим обработки файла, следует учитывать его назначение (“w” для записи, “r” для чтения данных). Следующий пример показывает простое взаимодействие с текстовым документом.
Выполнить точно такие же действия, но без необходимости вручную закрывать файл, вполне возможно благодаря связке операторов with as. Для этого необходимо поместить метод open сразу после ключевого слова with, а переменную, которая будет ссылаться на файл, прописать за конструкцией as. Ниже располагается пример открытия документа с помощью with as.
Оба примера небольших программ демонстрируют работу с test.txt, который генерируется в каталоге с исходным кодом. В качестве режима обработки для него выбирается запись данных. После этого при помощи метода write в него заносится строка “hello world”. Завершается код в обоих случаях закрытием текстового файла test.txt методом close или автоматически.
Запись построчно
Чтобы быстро записать информацию в текстовый файл, достаточно открыть его в программе, написанной на языке Python, после чего воспользоваться функцией write через переменную, которая ссылается на документ.
В Python запись в файл построчно осуществляется с помощью записи нужной строки с последующей записью символа перевода строки ‘\n’. Рассмотрим пример записи списка поэлементно. Каждый элемент будет записан в новой строке:
Приведенный выше пример небольшой программы показывает создание небольшого массива lines, который содержит три строковых элемента: “first”, “second” и “third”. За счет функции open и связки операторов with as происходит открытие текстового файла test.txt в корневом каталоге жесткого диска D. В цикле мы проходим по всем элементам списка и с помощью команды write их записываем. Чтобы каждая запись была с новой строки, добавляем символ перевода строки.
Так же можно воспользоваться функцией writelines. Если мы передадим в качестве ее параметра список, то она запишет элементы друг за другом в одну строку. Но можно поступить следующим образом: в качестве параметра передать генератор следующим образом.
Этот пример отличается от предыдущего тем, что вызывается метод writelines, который принимает в качестве аргумента генератор. Для разделения элементов последовательности тут применяется “\n”, благодаря чему каждое слово в документе будет находиться в отдельной строке.
Чтение построчно
Прочитать содержимое текстового файла построчно в языке Python очень просто, поскольку в этом прекрасно помогает цикл for. Но для начала все же необходимо открыть документ, как и в предыдущем случае, при помощи open и with as. Однако на этот раз следует указать другой режим обработки файла, выбрав для него “r” для получения доступа к чтению данных.
В этом примере показывается открытие файла test.txt, в котором уже содержится небольшой массив строк, записанный ранее. Построчное чтение информации из файла производится в цикле for. Каждая итерация выводит сведения из новой строки (line) при помощи функции print. Все элементы отображаются на экране построчно, как и были ранее помещены в test.txt.
Количество строк
Возможности языка Python позволяют производить и куда более сложные виды программных операций с внутренним содержимым текстовых файлов. Например, если требуется определить в Python количество строк в файле, можно открыть файл и в цикле посчитать количество занятых в нем строк. В этом поможет предварительно объявленная переменная count, в которую перед применением нужно записать 0, а затем прибавлять по единице с каждой новой строкой.
Приведенный выше пример демонстрирует работу счетчика count. Для взаимодействия с ним следует открыть текстовый файл в режиме чтения, а затем инкрементировать в каждом новом шаге цикла for объявленную ранее числовую переменную, которая затем выводится в print.
Можно поступить и другим способом. Прочитать файл в список с помощью readlines. А после этого с помощью функции len определить размер списка. Это и будет количество строк.
Поиск строки
Чтобы с помощью Python найти строку в текстовом файле, стоит прибегнуть к помощи встроенного метода readlines, который позволяет автоматически считывать внутреннее содержимое файла. Как и раньше, для начала необходимо открыть test.txt для чтения, чтобы затем поместить данные из него в специальный массив lines. Встроенный метод index позволяет найти номер элемента в последовательности, просто передав ему нужный объект, например, строку “second”.
Поскольку в test.txt все элементы располагаются в отдельных строках, к строке, которую стоит передать методу index в качестве аргумента, необходимо прибавить конструкцию “\n”.
Удаление строки
Чтобы в Python удалить ненужную строку из файла, следует воспользоваться сразу двумя режимами обработки файлов: чтение и запись. Для начала необходимо открыть test.txt для чтения, чтобы поместить информацию из него в отдельный массив lines. Далее потребуется удалить один из элементов последовательности при помощи оператора del, указав ему индекс нужной строки в квадратных скобках. Массив объектов, который получился в итоге, необходимо поместить в исходный текстовый файл, однако на этот раз открыть его надо в режиме записи.
Приведенный выше пример небольшой программы демонстрирует удаление строки из файла. В данном случае используются методы readlines и writelines, позволяющие считывать массив строк из документа и записывать его туда же, разделяя отдельные элементы списка.
Таким образом, можно достаточно легко взаимодействовать с содержимым текстовых файлов, пользуясь языком программирования Python 3. Его встроенные функции позволяют записывать данные в документ и считывать их в удобном для пользователя виде. При помощи средств по расширенной работе с файлами, можно управлять ими на куда более продвинутом уровне.