Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Построчные чтение и запись Python: Основы текстового ввода-вывода

Запись текста построчно

На предыдущем уроке я упоминал, что последовательные вызовы метода write дописывают текст в конец. Но часто мы имеем итератор, выдающий некий текст построчно. Можно, конечно, написать цикл, однако есть способ и получше: метод writelines. Работает он так:

>>> f = open("foo.txt", "w")
>>> f.writelines(["cat\n", "dog\n"])
>>> f.close()
>>> f = open("foo.txt", "r")
>>> print(f.read())
cat
dog

>>> f.close()

Как вы видите, все строчки записались в нужном порядке. Такой вариант записи предпочтителен, когда нужно записать большой объем текста, который вы получаете и обрабатываете строчка-за-строчкой. Можно предварительно накопить весь текст в одну большую строку, однако для этого может потребоваться большой объём памяти. Гораздо лучше записывать строчки по мере готовности и writelines для этого подходит идеально!

Чтение файла построчно

Файл построчно можно не только писать, но и читать:

>>> f = open("foo.txt")
>>> f.readline()
'cat\n'
>>> f.readline()
'dog\n'
>>> f.readline()
''
>>> f.close()

Здесь Python сам понимает, что строчки в тексте нужно разделять по символу перевода строки. Вызов readline перемещает позицию к следующей строке и как только текст закончится, все последующие вызовы будут возвращать пустую строку.

Заметьте, строчки текста содержат и сами символы перевода строки.

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

>>> f = open("foo.txt")
>>> for l in f:
...     print(l)
...
cat

dog

>>> f.close()

Если не указать режим, как я сделал в этот раз, то файл откроется на чтение. Удобно.

Подумайте, почему напечатались лишние пустые строчки.

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

Ленивость позволяет, в частности, не дочитать файл:

>>> f = open("foo.txt")
>>> for l in f:
...     print(l)
...     break
...
cat

>>> print(f.read())
dog

>>> f.close()

Если же нужно получить сразу все строчки текста в виде списка, то можно вызывать метод readlines и получить тот самый список.

Потоковая обработка больших файлов

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

input_file = open("input.txt", "r")
output_file = open("output.txt", "w")
for i, line in enumerate(input_file, 1):
    output_file.write("{}) {}".format(i, line))
input_file.close()
output_file.close()

Сохраните этот скрипт в файл и посмотрите, как он работает.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 120 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
27 октября 8 месяцев

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг»