Запись текста построчно
В предыдущем уроке мы упоминали, что последовательные вызовы метода 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(f"{i}) {line}")
input_file.close()
output_file.close()
Сохраните этот скрипт в файл и посмотрите, как он работает.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.