Чтение текстового файла
Уроки курсаЧтение текстового файла
Построчный перебор файла в цикле 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() + условие внутри цикла — встречается в реальном коде постоянно, как только нужно разобрать текстовый файл построчно.
