Python для новичковСтроки, модули и файлыЧтение текстового файла

Чтение текстового файла

Уроки курсаЧтение текстового файла

Построчный перебор файла в цикле for и обработка символа \n

Файловый объект, который возвращает open(), является итерируемым. Это значит, что его можно поставить прямо в for — и Python будет отдавать по одной строке за раз, не загружая весь файл в память сразу.

with open('data.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line)

Если data.txt содержит:

яблоко
банан
вишня

вывод будет выглядеть неожиданно:

яблоко

банан

вишня

Между строками — пустые строки. Откуда они берутся? print() сам добавляет перенос строки в конце. Но каждый элемент line уже содержит \n из файла — тот самый символ, который разделяет строки в тексте. Итого: \n из файла плюс \n от print() — и получается пустая строка между каждым выводом.

Фиксируется одним вызовом .strip():

with open('data.txt', 'r', encoding='utf-8') as f:
    for line in f:
        print(line.strip())

Метод strip() убирает пробельные символы с обоих концов строки — в том числе \n и пробелы. Результат становится предсказуемым:

яблоко
банан
вишня

Если нужно убрать только правый \n, не трогая возможные пробелы слева, используют rstrip(). На практике чаще пишут просто strip() — это безопаснее для большинства случаев.

Когда цикл предпочтительнее read() и readlines()

Цикл for line in f читает файл построчно: Python запрашивает следующую строку только когда предыдущая уже обработана. Это важно, если файл большой — скажем, логи на несколько гигабайт. read() и readlines() загрузили бы такой файл целиком в оперативную память, а цикл работает с ним постепенно.

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

Часто при переборе нужно не просто вывести строки, а что-то с ними сделать — проверить условие, накопить результат. Вот типичный сценарий: отфильтровать непустые строки:

with open('data.txt', 'r', encoding='utf-8') as f:
    result = []
    for line in f:
        cleaned = line.strip()
        if cleaned:  # пропускаем пустые строки
            result.append(cleaned)

print(result)  # ['яблоко', 'банан', 'вишня']

Здесь if cleaned проверяет, что после strip() строка не стала пустой. Пустая строка в Python — это False, поэтому проверка работает напрямую, без сравнения с ''.

Эта связка — for line in f + strip() + условие внутри цикла — встречается в реальном коде постоянно, как только нужно разобрать текстовый файл построчно.