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