Python Glossary English

все 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Сообщить о неточности