все Python 3Файлы и I/Oпонятие
Итерация по файлу
чтение
Файловый объект — итерируемый. Каждая итерация возвращает строку. Эффективно для больших файлов.
Синтаксис
for line in f:
...
Каждая строка приходит вместе с завершающим переводом строки, поэтому её почти всегда чистят через strip() или rstrip('\n') — у последней строки файла '\n' может и не быть. Итератор одноразовый и ленивый: после цикла файл исчерпан, и второй for по тому же объекту не даст ничего, пока не сделать f.seek(0). Именно ленивость и отличает такой обход от f.readlines() и f.read().split('\n'), которые затягивают весь файл в память.
Примеры
# Пример создаёт файл сам и работает во временной папке:
# путь вроде '/tmp/demo.txt' есть не на всякой системе.
import os, tempfile
os.chdir(tempfile.mkdtemp())
with open('demo.txt', 'w', encoding='utf-8') as f:
f.write('line1\nline2\nline3\n')
# Построчный обход: файл — итератор, вся целиком в память он не читается
with open('demo.txt', encoding='utf-8') as f:
print([line.strip() for line in f]) # → ['line1', 'line2', 'line3']
# Фильтрация строк
with open('demo.txt', encoding='utf-8') as f:
lines = [line.strip() for line in f if line.strip()]
print(lines) # → ['line1', 'line2', 'line3']
# Подсчёт строк
with open('demo.txt', encoding='utf-8') as f:
count = sum(1 for _ in f)
print(count) # → 3
# Первые N строк
with open('demo.txt', encoding='utf-8') as f:
head = [next(f) for _ in range(2)]
print([line.strip() for line in head]) # → ['line1', 'line2']
# enumerate для нумерации строк
with open('demo.txt', encoding='utf-8') as f:
numbered = [f'{i}: {line.strip()}' for i, line in enumerate(f, 1)]
print(numbered) # → ['1: line1', '2: line2', '3: line3']
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности