Перейти к содержимому

Как считать строку в питоне

  • автор:

Как прочитать файл построчно в Python

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

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

Пример 1: Чтение файла построчно функцией readline()

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

Как использовать функцию file.readline()

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

  1. Открываем файл в режиме чтения. При этом возвращается дескриптор файла.
  2. Создаём бесконечный цикл while.
    1. В каждой итерации считываем строку файла при помощи readline() .
    2. Если строка не пустая, то выводим её и переходим к следующей. Вы можете проверить это, используя конструкцию if not . В противном случае файл больше не имеет строк и мы останавливаем цикл с помощью break .
     
     
    # получим объект файла file1 = open("sample.txt", "r") while True: # считываем строку line = file1.readline() # прерываем цикл, если строка пустая if not line: break # выводим строку print(line.strip()) # закрываем файл file1.close
    Привет! Добро пожаловать на PythonRu. Удачи в обучении!

    Пример 2: Чтение строк как список функцией readlines()

    Функция readlines() возвращает все строки файла в виде списка. Мы можем пройтись по списку и получить доступ к каждой строке.

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

     
    # получим объект файла file1 = open("sample.txt", "r") # считываем все строки lines = file1.readlines() # итерация по строкам for line in lines: print(line.strip()) # закрываем файл file1.close
    Привет! Добро пожаловать на PythonRu. Удачи в обучении!

    Пример 3: Считываем файл построчно из объекта File

    В нашем первом примере, мы считываем каждую строку файла при помощи бесконечного цикла while и функции readline() . Но Вы можете использовать цикл for для файлового объекта, чтобы в каждой итерации цикла получать строку, пока не будет достигнут конец файла.

    Ниже приводится программа, демонстрирующая применение оператора for-in, для того, чтобы перебрать строки файла.

    Для демонстрации откроем файл с помощью with open. Это применимо и к предыдущим двум примерам.

    python: чтение строк и работа с каждой из строк

    Всем привет! Мне необходима работа со строками из файла. У меня есть файл bonus.py , в нем содержится:

    1 2 3 

    И есть файл test.py , в нем содержится:

    import bonus file = open('c://testper/bonus.py', 'r') qwe = file.readlines() print(qwe) # для считывания строк, что там вообще содержится if qwe == '1': print('Sucs!(1)') else: print('error') 

    Он выводит error, так как не обнаружил в файле bonus.py цифру 1. В print(qwe) выводится:

    Как сделать так, чтобы он читал ВСЕ строки, и в строках искал то число, которое необходимо для вывода 'Sucs(1)'?

    Отслеживать
    25.4k 4 4 золотых знака 20 20 серебряных знаков 36 36 бронзовых знаков
    задан 12 авг 2021 в 12:01
    113 6 6 бронзовых знаков

    изменил file.readlines() на file.read() - в print(qwe) выводит: 1 2 3 (по каждой строке), но всё равно вылазит ошибка

    12 авг 2021 в 12:15

    1 ответ 1

    Сортировка: Сброс на вариант по умолчанию

    1. Так как в файле bonus.py находятся цифры: 1, 2, 3, где каждая с новой строки, следовательно в списке 'qwe' после каждой цифры стоит '\n', '\n' обозначает перенос на след. строчку.
    2. В этой строчке if qwe == '1': вы сравниваете список со строкой, а не строку со строкой.

    Вот один из вариантов решения:

    import bonus file = open(r'c://testper/bonus.py', 'r') qwe = file.readlines() print(qwe) # для считывания строк, что там вообще содержится if '1\n' in qwe: print('Sucs!(1)') else: print('error') 

    Вот еще более удобный:

    import bonus file = open(r'C:\Users\mihai\.spyder-py3/bonus.py', 'r') qwe = [x.strip() for x in file.readlines()] # убираем '\n' print(qwe) # для считывания строк, что там вообще содержится if '1' in qwe: print('Sucs!(1)') else: print('error') 

    Как считать строку в питоне

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

    print("Hello METANIT.COM")

    Данный код выведет нам на консоль строку "Hello METANIT.COM".

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

    print("Hello World") print("Hello METANIT.COM") print("Hello Python")

    Здесь три вызова функции print() выводят некоторое сообщение. Причем при выводе на консоль каждое сообщение будет размещаться на отдельной строке:

    Hello World Hello METANIT.COM Hello Python

    Такое поведение не всегда удобно. Например, мы хотим, чтобы все значения выводились на одной строке. Для этого нам надо настроить поведение функции с помощью параметра end . Этот параметр задает символы, которые добавляются в конце к выводимой строке и . При применении параметра end вызов функции print() выглядит следующим образом:

    print(значение, end = конечные_символы)

    По умолчанию end равен символу "\n" , который задает перевод на следующую строку. Собственно поэтому функция print по умолчанию выводит передаваемое ей значение на отдельной строке.

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

    print("Hello World", end=" ") print("Hello METANIT.COM", end=" ") print("Hello Python")

    То есть теперь выводимые значения будут разделяться пробелом:

    Hello World Hello METANIT.COM Hello Python

    Причем это может быть не один символ, а набор символов:

    print("Hello World", end=" and ") print("Hello METANIT.COM", end=" and ") print("Hello Python")

    В данном случае выводимые сообщения будут отделяться символами " and " :

    Hello World and Hello METANIT.COM and Hello Python

    Консольный ввод

    Наряду с выводом на консоль мы можем получать ввод пользователя с консоли, получать вводимые данные. Для этого в Python определена функция input() . В эту функцию передается приглашение к вводу. А результат ввода мы можем сохранить в переменную. Например, определим код для ввода пользователем имени:

    name = input("Введите свое имя: ") print(f"Ваше имя: ")

    В данном случае в функцию input() передается приглашение к вводу в виде строки "Введите свое имя: ". Результат функции - результат ввода пользователя передается в переменную name . Затем мы можем вывести значение этой переменной на консоль с помощью функции print() . Пример работы кода:

    Введите свое имя: Eugene Ваше имя: Eugene

    Еще пример с вводом нескольких значений:

    name = input("Your name: ") age = input("Your age: ") print(f"Name: Age: ")

    Пример работы программы:

    Your name: Tom Your age: 37 Name: Tom Age: 37

    Стоит учитывать, что все введенные значения рассматриваются как значения типа str , то есть строки. И даже если мы вводим число, как в втором случае в коде выше, то Python все равно будет рассматривать введенное значение как строку, а не как число.

    Подсчет строк, слов и символов в файле

    Цикл for языка Python извлекает из файлового объекта данные построчно (одну строку на каждой итерации цикла). Таким образом, количество итераций цикла определит количество строк в файле.

    Встроенная функция len() языка Python считает количество элементов в передаваемой в нее объекте. С ее помощью находится количество символов в каждой строке.

    Строковый метод split() разбивает строку на части. По-умолчанию разделение происходит по местам расположения пробелов в строке. Таким образом, мы можем определить количество слов в каждой строке, посчитав с помощью len() слова в получившемся после применения split() списке.

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

    file = open('text.txt') lines = 0 words = 0 symbols = 0 for line in file: lines += 1 words += len(line.split()) symbols += len(line) print("Lines:", lines) print("Words:", words) print("Symbols:", symbols)

    Пусть содержимое файла text.txt будет таким:

    one two three city town big small

    Тогда программа даст следующий результат:

    Lines: 3 Words: 7 Symbols: 34

    Cимволами считаются не только буквы, также пробелы и переходы на новую строку (символ '\n' ). Если требуется не учитывать переход на новую строку как символ, его можно "отрезать" с помощью строкового метода strip() . Делается это перед тем, как строка передается в функцию len() : symbols += len(line.strip('\n')) .

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

    file = open('text.txt') text = file.read() lines = 0 words = 0 symbols = 0 in_word = False for char in text: symbols += 1 if char == '\n': lines += 1 if char != ' ' and char != '\n' and in_word == False: words += 1 in_word = True elif char == ' ' or char == '\n': in_word = False print("Lines:", lines) print("Words:", words) print("Symbols:", symbols)

    Здесь на каждой итерации цикла мы имеем дело не с целой строкой, а с очередным символом. При этом увеличиваем на единицу переменную, хранящую количество символов, и, если текущий символ - это переход на новую строку, переменную для подсчета количества строк.

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

    Алгоритм подсчета слов в программе выше следующий. Если текущий символ не пробел И не переход на новую строку, И ранее мы находились вне слова ( in_word == False ), то есть соблюдены все три условия сразу, значит началось новое слово. Поэтому увеличиваем счетчик слов и устанавливаем in_word в значение True . Последнее действие позволит на следующей итерации цикла, при условии обработки второй и послеющих букв слова, не соблюдаться условию in_word == False и не увеличивать счетчик слов.

    Мы "сбрасываем" in_word в False , только когда встречаем пробельный символ ИЛИ переход на новую строку (любое одно из двух условий).

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

    . for char in text: if char == '\n': lines += 1 else: symbols += 1 .

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

    Если файл большой, то считывать сразу все его содержимое в строковую переменную ( text = file.read() ) неблагоразумно. Если читать файл посимвольно ( file.read(1) ), то условием завершения работы цикла будет момент возрата методом read() пустой строки, что означает конец файла (в других языках может быть специальный символ конца файла, доступный через идентификатор EOF - end of file).

    lines = 0 words = 0 symbols = 0 in_word = False with open('text.txt') as file: while True: char = file.read(1) if char == '': break symbols += 1 if char == '\n': lines += 1 if char not in (' ', '\n') and not in_word: words += 1 in_word = True elif char in (' ', '\n'): in_word = False print("Lines:", lines) print("Words:", words) print("Symbols:", symbols)

    В этом примере для открытия файла используется оператор with , который рекомендован для работы с файлами. Выражения char not in (' ', '\n') and not in_word и char in (' ', '\n') по смыслу аналогичны соответствующим логическим выражениям из предыдущих вариантов программы.

    X Скрыть Наверх

    Решение задач на Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *