Python — работа с файлами и текстом

Приветствую! Здесь вы наверняка найдете, что ищете. Примеры в лаборатории рассчитаны на то, что мы разбираем что-то конкретное.

Текущая статья посвящена работе с файлами и текстом на Python — чтение, запись, CSV, JSON, логи и pathlib.

Поэтому за теорией по текущей теме вам — в энциклопедию. Если ещё не погружались, то маршрут прост:

  1. Основы
  2. Система и сеть
  3. Данные и разметка
  4. Код и разработка
  5. Языки
  6. Искусственный интеллект
  7. Проект
  8. Инфраструктура и безопасность
  9. Спин-офф

Обязательно пройдитесь.

А теперь приступим к нашему предмету.

Теория и соседние материалы

Файловая система, HTTP и форматы данных — Работа с файлами, сетью и внешними API.

Общая теория I/O — Чтение и запись.

Большие таблицы — Pandas.

Ввод для ЕГЭ и олимпиад — алгоритмы на Python.

Сложный поиск по тексту — Regex.


Основы работы с файлами и текстом на Python

Как запустить любой пример

  1. Установите Python 3 (на Windows отметьте «Add python to PATH»).
  2. Создайте папку, например files_lab.
  3. Сохраните код в read_demo.py.
  4. Если пример читает файл — создайте этот файл в той же папке (или укажите полный путь).
  5. Откройте терминал в этой папке и выполните:
python read_demo.py

Проверка с готовым входом (удобно на Stepik и при отладке):

python task.py < input.txt

Символ < перенаправляет содержимое input.txt в программу так, будто вы вводите его с клавиатуры.


Навигация по примерам

Ищут в интернете Раздел ниже
python read file / python прочитать файл Стартовые примеры
python write to file / python запись в файл Запись в файл
python open file with encoding utf-8 Обязательный шаблон
python read file line by line / построчно Построчное чтение
python pathlib read text pathlib
python count words in file / подсчёт слов Подсчёт слов
python sum numbers from file Чтение чисел
python csv read write example CSV
python json load dump file JSON
python FileNotFoundError Обработка ошибок
python strip split join Строки и текст
python append to file / дописать в файл Добавление в лог
python copy file text Копирование

Обязательный шаблон

Любая работа с текстовым файлом в Python 3 строится вокруг двух идей:

  1. open(path, mode, encoding) — «открой файл так-то».
  2. with .. as f — «работай с файлом внутри блока и обязательно закрой его после».

Без with нужно вручную вызывать f.close(). Если программа упадёт с ошибкой до close(), файл может остаться «занятым» — на Windows это частая причина «файл используется другим процессом».

with open("data.txt", "r", encoding="utf-8") as f:
    text = f.read()

# f уже закрыт — повторно читать из него нельзя

Разбор построчно:

Строка Что происходит Зачем
with open(..) Открывает файл и готовит контекстный менеджер Автоматическое закрытие
"data.txt" Путь к файлу Относительный путь — от папки, откуда вы запустили python
"r" Режим read — только чтение Файл должен существовать
encoding="utf-8" Как декодировать байты в символы Без этого на Windows часто UnicodeDecodeError на русском
as f Имя объекта «файл» внутри блока Через f вызывают .read(), .write() и т.д.
f.read() Читает весь файл в одну строку str Удобно для маленьких файлов
после блока with Python вызывает f.close() Ресурс освобождён

Режимы, которые понадобятся чаще всего:

Режим Действие Тема
"r" Чтение python read text file
"w" Запись, старый текст стирается python create file and write
"a" Дописать в конец python append to file
"x" Создать, если файла ещё нет python create file if not exists
"rb" / "wb" Байты, не текст python read binary file
Файл на диске и строка в программе

На диске файл — это байты.

Режим `"r"` с `encoding="utf-8"` превращает байты в строку Python (`str`).

Символ перевода строки хранится как `\n` — его часто убирают через `strip()` перед сравнением или `int()`.


Стартовые примеры

Пять коротких скриптов, с которых обычно начинают лабораторную: создать файл → прочитать → пройти построчно → дописать строку → записать список.


Запись текста в файл

Задача: создать hello.txt с двумя строками текста.

with open("hello.txt", "w", encoding="utf-8") as f:
    f.write("Привет, файл!\n")
    f.write("Вторая строка.\n")

Что появится на диске (hello.txt):

Привет, файл!
Вторая строка.

Разбор:

Строка Смысл
"w" Write — если hello.txt был, его содержимое удалят и запишут заново
f.write("..\n") Пишет строку в файл; \n — перевод строки (Enter)
два вызова write Можно писать сколько угодно раз внутри одного with

Частая ошибка: открыть с "w", думая, что допишете в конец. Для дописывания нужен режим "a" — см. ниже.


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

Задача: прочитать hello.txt целиком и вывести в консоль.

with open("hello.txt", "r", encoding="utf-8") as f:
    content = f.read()

print(content)

Вывод в терминале:

Привет, файл!
Вторая строка.

Разбор:

Строка Смысл
"r" Только чтение; файл должен существовать, иначе FileNotFoundError
content = f.read() Одна большая строка, включая \n между строками файла
print(content) print добавляет ещё один \n в конце — между абзацами может быть «лишняя» пустая строка

Смысл приёма: read() — самый простой способ «загрузить весь текст в переменную» для маленьких файлов (заметка, конфиг на 20 строк).


Построчное чтение

Задача: вывести каждую строку без лишних пустых строк вокруг.

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

Разбор:

Строка Смысл
for line in f Файл — итератор по строкам; в память не грузится весь файл сразу
line Строка с \n на конце (кроме, возможно, последней)
line.strip() Убирает \n, пробелы и табы по краям

Когда так делают: лог на тысячи строк, подсчёт слов, фильтр «только строки с ERROR» — см. раздел 8.

Частая ошибка: сравнивать line == "текст" без strip() — из‑за \n сравнение всегда ложное.


Добавление строки в конец (лог)

Задача: дописать одну строку в app.log, не удаляя старые записи.

with open("app.log", "a", encoding="utf-8") as f:
    f.write("2026-05-31 — программа завершилась\n")

Разбор:

Строка Смысл
"a" Append — курсор всегда в конце файла
каждый запуск скрипта Новая строка добавляется ниже предыдущих

Смысл приёма: простое логирование без библиотек — «кто когда запускал скрипт», «какая ошибка случилась».


Запись списка строк

Задача: записать несколько строк из списка Python в list.txt.

lines = ["Первая\n", "Вторая\n", "Третья\n"]

with open("list.txt", "w", encoding="utf-8") as f:
    f.writelines(lines)

Разбор:

Строка Смысл
lines = [..] Список строк; \n внутри каждой — ваша ответственность
writelines(lines) Пишет элементы списка подряд, без автоматического \n между ними
отличие от цикла for s in lines: f.write(s) То же поведение; writelines чуть короче

Частая ошибка: забыть \n в строках — получится одна длинная строка ПерваяВтораяТретья.


Примеры работы с файлами и текстом

1. Чтение файлов

1.1. read(), readline(), readlines()

Задача: понять, чем отличаются три способа чтения одного открытого файла.

with open("sample.txt", "r", encoding="utf-8") as f:
    whole = f.read()
    f.seek(0)
    first = f.readline()
    f.seek(0)
    all_lines = f.readlines()

Разбор:

Строка Смысл
whole = f.read() Весь текст → одна строка str
f.seek(0) Сброс «курсора» в начало файла — иначе читать будет нечего
first = f.readline() Одна строка (с \n на конце)
all_lines = f.readlines() Список list[str] — каждый элемент строка файла

Сводка — что выбрать:

Метод Тип результата Память Когда
read() str весь файл Мало текста
readline() str одна строка Нужна первая/следующая строка
readlines() list[str] весь файл Нужен список для sort, индексов
for line in f по одной минимум Большой файл, лог

1.2. Фильтрация строк по условию

Задача: из notes.txt вывести только строки, где встречается слово «Python».

Файл notes.txt:

Сегодня учили Python
Завтра контрольная по математике
Python удобен для файлов
keyword = "Python"

with open("notes.txt", "r", encoding="utf-8") as f:
    for line in f:
        if keyword in line:
            print(line.strip())

Вывод:

Сегодня учили Python
Python удобен для файлов

Разбор:

Строка Смысл
keyword = "Python" Искомая подстрока — вынесена в переменную, легко менять
if keyword in line Проверка «есть ли подстрока в строке» — регистр важен (pythonPython)
print(line.strip()) Печать без \n на конце — иначе двойные пустые строки

Смысл приёма: простейший «поиск по файлу» без regex — подходит для логов и конспектов.


1.3. Чтение чисел из файла

Задача: в файле по одному числу на строку — найти сумму.

Файл numbers.txt:

10
20
30
total = 0

with open("numbers.txt", "r", encoding="utf-8") as f:
    for line in f:
        total += int(line.strip())

print("Сумма:", total)

Вывод: Сумма: 60

Разбор:

Строка Смысл
total = 0 Накопитель суммы — типичный шаблон «цикл + +=»
int(line.strip()) "10\n""10" → число 10
total += .. То же, что total = total + ..

Частая ошибка: int(line) без strip() — обычно работает, но если в файле пробелы 10, нужен strip().

Вариант — все числа в одной строке:

with open("numbers.txt", "r", encoding="utf-8") as f:
    line = f.read()
    nums = list(map(int, line.split()))
    print(sum(nums))

Файл тогда: 10 20 30. Цепочка map(int, line.split()) — тот же приём, что в алгоритмах на Python.


2. Запись и добавление

2.1. Формирование отчёта построчно

Задача: записать табличный отчёт по оценкам в report.txt.

students = [
    ("Анна", 5),
    ("Борис", 4),
    ("Вика", 5),
]

with open("report.txt", "w", encoding="utf-8") as f:
    f.write("Отчёт по оценкам\n")
    f.write("-" * 20 + "\n")
    for name, grade in students:
        f.write(f"{name}: {grade}\n")

Файл report.txt после запуска:

Отчёт по оценкам
--------------------
Анна: 5
Борис: 4
Вика: 5

Разбор:

Строка Смысл
students = [(.., ..), ..] Список кортежей — данные в программе, не в файле
"-" * 20 Строка из 20 символов - — декоративная линия
for name, grade in students Распаковка кортежа на каждой итерации
f"&#123;name&#125;: &#123;grade&#125;\n" f-строка — подстановка переменных в текст

Смысл приёма: типичная лабораторная «есть данные в коде → сохранить отчёт на диск».


2.2. Безопасное создание файла ("x")

Задача: создать файл только если его ещё нет — случайно не затереть чужую работу.

try:
    with open("unique.txt", "x", encoding="utf-8") as f:
        f.write("Файл создан впервые\n")
except FileExistsError:
    print("Файл unique.txt уже существует — не перезаписываем.")

Разбор:

Строка Смысл
"x" Exclusive creation — ошибка, если файл есть
try / except FileExistsError Перехват конкретной ошибки «файл уже есть»
сообщение в print Пользователь понимает, почему запись не произошла

2.3. Копирование текста из одного файла в другой

Задача: скопировать содержимое source.txt в backup.txt.

def copy_text(src: str, dst: str) -> None:
    with open(src, "r", encoding="utf-8") as f_in:
        text = f_in.read()
    with open(dst, "w", encoding="utf-8") as f_out:
        f_out.write(text)

copy_text("source.txt", "backup.txt")

Разбор:

Строка Смысл
def copy_text(..) Функция с типами — можно вызывать много раз
первый with Только чтение источника
второй with Запись в новый файл; "w" создаст или перезапишет backup.txt
два блока with Нельзя одновременно открыть один путь и на чтение, и на запись в одном with для копии разных файлов — так и задумано

Смысл приёма: минимальный бэкап текстового файла перед правкой скриптом.


3. pathlib

Модуль pathlib — современный способ работы с путями. Вместо склеивания строк "folder" + "/" + "file.txt" пишут Path("folder") / "file.txt".

3.1. Чтение и запись через Path

Задача: прочитать data/notes.txt, а если файла нет — создать папку и файл.

from pathlib import Path

p = Path("data") / "notes.txt"

if p.exists():
    text = p.read_text(encoding="utf-8")
    print(text)
else:
    p.parent.mkdir(parents=True, exist_ok=True)
    p.write_text("Новый файл\n", encoding="utf-8")

Разбор:

Строка Смысл
from pathlib import Path Класс пути из стандартной библиотеки
Path("data") / "notes.txt" Кроссплатформенный путь data/notes.txt
p.exists() True, если файл или папка есть
p.read_text(..) Аналог open + read() в одной строке
p.parent Папка data
mkdir(parents=True, exist_ok=True) Создать все промежуточные папки; не падать, если уже есть
p.write_text(..) Записать строку; перезапишет файл

3.2. Поиск всех .txt в папке

Задача: вывести имена и размер каждого .txt в текущей папке.

from pathlib import Path

for txt_file in Path(".").glob("*.txt"):
    print(txt_file.name, "—", txt_file.statst_size, "байт")

Разбор:

Строка Смысл
Path(".") Текущая рабочая папка (откуда запустили python)
.glob("*.txt") Все файлы с расширением .txt только здесь, без подпапок
txt_file.name Только имя файла, без пути
.statst_size Размер в байтах

Рекурсивный поиск: Path("docs").rglob("*.md") — все .md в docs и вложенных папках.


3.3. Переименование

from pathlib import Path

old = Path("draft.txt")
new = Path("final.txt")

if old.exists():
    old.rename(new)

Разбор: rename на Windows переименовывает в той же папке; для переноса в другой каталог тоже используют rename или shutil.move.


4. Строки и текст

Файл на диске — текст. После read() вы работаете со строками str: режете, чистите, считаете.

4.1. Разбор строки на слова

strip() убирает пробелы по краям, split() режет строку на список. Подробнее о методах и о том же приёме в других языках — обрезка и разбиение строк.

line = "  Python отлично подходит для скриптов  "

words = line.strip().split()
print(words)

Вывод: ['Python', 'отлично', 'подходит', 'для', 'скриптов']

Разбор:

Вызов Результат
strip() убирает пробелы и перевод строки по краям строки
split() разрез по пробелам → список слов
split(",") разрез по запятой (простой разбор CSV без библиотеки)
" ".join(words) склеить список обратно в одну строку через пробел

4.2. Замена и подсчёт вхождений

text = "error: disk full\nwarning: low memory\nerror: timeout\n"

print(text.count("error"))
print(text.replace("error", "ERR"))

Разбор:

Метод Смысл
count("error") Сколько раз подстрока встретилась → 2
replace("error", "ERR") Новая строка с заменой всех вхождений; исходный text не меняется

4.3. Подсчёт слов в файле

Задача: посчитать слова в article.txt (пробелы — разделители).

def count_words(path: str) -> int:
    total = 0
    with open(path, "r", encoding="utf-8") as f:
        for line in f:
            total += len(line.split())
    return total

print("Слов:", count_words("article.txt"))

Разбор:

Строка Смысл
len(line.split()) Число «кусков» между пробелами в одной строке
total += .. Суммируем по всем строкам файла

Ограничение: "don't" считается одним словом; знаки препинания прилипают к словам — для отчёта это обычно нормально.


4.4. Самые частые слова

Задача: топ-5 слов в статье (без учёта регистра, с грубой очисткой пунктуации).

Разбор:

Строка Смысл
Counter() Словарь «слово → сколько раз встретилось»
line.lower() Python и python — одно слово
strip(".,!?..") Убрать пунктуацию по краям слова
counter[word] += 1 Увеличить счётчик
most_common(n) n самых частых пар (слово, число)

4.5. Нормализация текста перед сохранением

Задача: убрать лишние пробелы и пустые строки перед записью в файл.

def normalize_lines(raw: str) -> str:
    lines = [line.strip() for line in raw.splitlines()]
    lines = [line for line in lines if line]
    return "\n".join(lines) + "\n"

dirty = "  первая  \n\n  вторая  \n"
clean = normalize_lines(dirty)

with open("clean.txt", "w", encoding="utf-8", newline="\n") as f:
    f.write(clean)

Разбор:

Строка Смысл
splitlines() Разбить на строки по \n, \r\n
list comprehension с if line Оставить только непустые строки
"\n".join(lines) Склеить строки обратно
newline="\n" На Windows записать Unix-переводы строк — удобно для Git

5. CSV — стандартная библиотека

CSV — таблица в текстовом файле: ячейки разделены запятой или точкой с запятой. Excel и Google Таблицы умеют открывать .csv.

5.1. Запись CSV


import csv

rows = [
    ["Имя", "Оценка"],
    ["Анна", "5"],
    ["Борис", "4"],
]

with open("grades.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f, delimiter=";")
    writer.writerows(rows)

Файл grades.csv:

Имя;Оценка
Анна;5
Борис;4

Разбор:

Строка Смысл
import csv Модуль из стандартной библиотеки — pip не нужен
newline="" Обязательно для csv на Windows — иначе лишние пустые строки
delimiter=";" В русской локали Excel часто ждёт ;, не ,
writer.writerows(rows) Записать все строки таблицы

5.2. Чтение CSV


import csv

with open("grades.csv", "r", encoding="utf-8", newline="") as f:
    reader = csv.reader(f, delimiter=";")
    header = next(reader)
    for row in reader:
        name, grade = row
        print(name, "→", grade)

Разбор:

Строка Смысл
next(reader) Первая строка — заголовки столбцов
row Список строк ячеек одной строки таблицы
name, grade = row Распаковка двух колонок

5.3. CSV со словарями (DictReader)

Задача: обращаться к ячейкам по имени столбца, а не по индексу.


import csv

with open("grades.csv", "r", encoding="utf-8", newline="") as f:
    reader = csv.DictReader(f, delimiter=";")
    for record in reader:
        print(record["Имя"], record["Оценка"])

Разбор:

Строка Смысл
DictReader Первая строка файла → ключи словаря
record["Имя"] Значение колонки «Имя» в текущей строке

Когда брать pandas: группировки, фильтры, merge — Pandas в Lab.


6. JSON в файле

JSON — текстовый формат для настроек и обмена данными между программами и сайтами.

6.1. Запись и чтение

Файл config.json:

{
  "title": "Мой проект",
  "version": 1,
  "tags": [
    "python",
    "files"
  ]
}

Разбор:

Строка Смысл
data = {..} Словарь Python — структура «ключ → значение»
json.dump(data, f, ..) Сериализация в файл
ensure_ascii=False Кириллица остаётся читаемой, не \u041c
indent=2 Отступы — удобно править руками
json.load(f) Прочитать JSON из файла → снова dict/list
loaded["title"] Доступ как к обычному словарю

Пара dump / load — для файлов; dumps / loads — для строк в памяти.


7. Обработка ошибок

7.1. Файл не найден

from pathlib import Path

path = Path("missing.txt")

try:
    text = path.read_text(encoding="utf-8")
except FileNotFoundError:
    print("Файл не найден:", path)
except PermissionError:
    print("Нет прав на чтение:", path)

Разбор:

Исключение Когда
FileNotFoundError Путь не существует
PermissionError Файл есть, но ОС запретила чтение

Смысл: программа не падает с длинным traceback — пользователь видит понятное сообщение.


7.2. Неверная кодировка

Задача: прочитать файл, не зная заранее — UTF-8 или Windows-1251.

def read_with_fallback(path: str) -> str:
    for encoding in ("utf-8", "utf-8-sig", "cp1251"):
        try:
            with open(path, "r", encoding=encoding) as f:
                return f.read()
        except UnicodeDecodeError:
            continue
    raise ValueError(f"Не удалось прочитать {path} — неизвестная кодировка")

Разбор:

Кодировка Зачем
utf-8 Стандарт в интернете и современных редакторах
utf-8-sig UTF-8 с BOM — часто после Excel «CSV UTF-8»
cp1251 Старые .txt на русской Windows

7.3. Резервная копия перед перезаписью

from pathlib import Path

def safe_write(path: Path, content: str) -> None:
    if path.exists() and path.statst_size > 0:
        backup = path.with_suffix(path.suffix + ".bak")
        backup.write_text(path.read_text(encoding="utf-8"), encoding="utf-8")
    path.write_text(content, encoding="utf-8")

Разбор:

Строка Смысл
path.statst_size Размер файла в байтах — 0 значит пустой
with_suffix(.. + ".bak") report.txtreport.txt.bak
затем write_text Новое содержимое в основной файл

8. Практические мини-задачи

Типичные формулировки из лабораторных: «объединить файлы», «вытащить ошибки из лога», «посчитать статистику текста».

8.1. Объединение нескольких текстовых файлов

from pathlib import Path

def merge_txt(files: list[Path], output: Path) -> None:
    parts: list[str] = []
    for file in files:
        parts.append(file.read_text(encoding="utf-8"))
    output.write_text("\n".join(parts), encoding="utf-8")

merge_txt(
    [Path("part1.txt"), Path("part2.txt")],
    Path("merged.txt"),
)

Разбор: каждый файл → строка в списке parts; "\n".join вставляет перевод строки между файлами.


8.2. Фильтр строк лога по уровню

Файл server.log:

INFO  User logged in
ERROR Database timeout
INFO  Request completed
ERROR Disk full
def filter_errors(log_path: str, out_path: str) -> None:
    with open(log_path, "r", encoding="utf-8") as f_in, \
         open(out_path, "w", encoding="utf-8") as f_out:
        for line in f_in:
            if "ERROR" in line:
                f_out.write(line)

filter_errors("server.log", "errors_only.log")

Разбор:

Строка Смысл
with open(..) as f_in, open(..) as f_out Два файла в одном with
if "ERROR" in line Пропускаем только строки с маркером ошибки
f_out.write(line) Пишем строку как есть, с её \n

Файл errors_only.log:

ERROR Database timeout
ERROR Disk full

8.3. Подсчёт строк, слов и символов

Задача: статистика текста — как команда wc в Linux.

def file_stats(path: str) -> dict[str, int]:
    lines = words = chars = 0
    with open(path, "r", encoding="utf-8") as f:
        for line in f:
            lines += 1
            words += len(line.split())
            chars += len(line)
    return {"lines": lines, "words": words, "chars": chars}

stats = file_stats("article.txt")
print(stats)

Пример вывода: &#123;'lines': 42, 'words': 318, 'chars': 2048&#125;

Разбор: chars считает символы включая \n в каждой строке — для учебной задачи этого достаточно.


8.4. Пакетное переименование .txt.md

from pathlib import Path

def rename_txt_to_md(folder: str, dry_run: bool = True) -> None:
    for txt in Path(folder).glob("*.txt"):
        new_name = txt.with_suffix(".md")
        print(f"{txt.name} → {new_name.name}")
        if not dry_run:
            txt.rename(new_name)

rename_txt_to_md("notes", dry_run=True)

Разбор:

Параметр Смысл
dry_run=True Только показать план; файлы не трогаем
dry_run=False Выполнить rename

Сначала смотрите вывод print, потом ставьте dry_run=False.


8.5. Самый длинный .txt в папке

Разбор: sum(1 for _ in f) — число итераций цикла = число строк, без хранения строк в памяти.


8.6. Конфиг «ключ=значение»

Файл settings.cfg:

host=localhost
port=8080
debug=true
# комментарий
def load_config(path: str) -> dict[str, str]:
    config: dict[str, str] = {}
    with open(path, "r", encoding="utf-8") as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith("#"):
                continue
            key, _, value = line.partition("=")
            config[key.strip()] = value.strip()
    return config

print(load_config("settings.cfg"))

Разбор:

Строка Смысл
line.startswith("#") Пропуск комментариев
line.partition("=") Разрез по первому = → ключ и значение
dict[str, str] Все значения пока строки; port"8080", не число

9. Чтение из stdin (олимпиад и Stepik)

Задача: сложить два числа, когда вход лежит в input.txt, а запуск: python task.py < input.txt.

Файл input.txt:

10
20

import sys

data = sys.stdin.readstripsplit()

if len(data) >= 2:
    a, b = int(data[0]), int(data[1])
    print(a + b)

Вывод: 30

Разбор:

Строка Смысл
sys.stdin Поток ввода — клавиатура или перенаправленный файл
.read() Весь stdin до конца (EOF)
.stripsplit() Убрать края → разбить по пробелам/переводам строк
int(data[0]) Первое «слово» → число

Альтернатива — построчно (когда числа на разных строках):


import sys

lines = sys.stdin.readstripsplitlines()
a = int(lines[0])
b = int(lines[1])
print(a + b)

Подробнее — каркас ввода-вывода.


10. Переиспользуемые заготовки

10.1. Универсальное чтение и запись

from pathlib import Path

def read_text_file(path: str | Path, encoding: str = "utf-8") -> str:
    return Path(path).read_text(encoding=encoding)

def write_text_file(path: str | Path, content: str, encoding: str = "utf-8") -> None:
    p = Path(path)
    p.parent.mkdir(parents=True, exist_ok=True)
    p.write_text(content, encoding=encoding, newline="\n")

Разбор: mkdir(parents=True) создаёт путь к файлу, если папок ещё нет — удобно для output/reports/summary.txt.


10.2. Генератор строк большого файла

def iter_lines(path: str, encoding: str = "utf-8"):
    with open(path, "r", encoding=encoding) as f:
        for line in f:
            yield line.rstrip("\n")

Разбор:

Строка Смысл
yield Функция становится генератором — отдаёт по одной строке
rstrip("\n") Убрать только перевод строки справа, пробелы в тексте сохранить

Использование:

for line in iter_lines("big.log"):
    if "ERROR" in line:
        print(line)

11. Частые ошибки новичков

Симптом Причина Решение
FileNotFoundError Файл не там, где вы думаете Печатайте Path.cwd() — текущая папка; кладите файл рядом со скриптом
UnicodeDecodeError Нет encoding или неверная кодировка encoding="utf-8" или fallback
Старый лог исчез Открыли с "w" вместо "a" Для дописывания — "a"
PermissionError на Windows Файл открыт в Excel/Блокноте Закройте программу, используйте with
readlines() на огромном файле Вся память занята списком for line in f
C:\data\file.txt ломает строку \f — escape r"C:\data\file.txt" или Path
CSV с пустыми строками Нет newline="" open(.., newline="")
int(line) падает Пустая строка в файле Проверяйте if line.strip():
Перед массовым удалением
unlink(), rename() в цикле и rmtree() необратимы. Сначала dry_run и print, потом бэкап папки.

Навигация по примерам

Раздел Что ищут
Обязательный шаблон with open, encoding, режимы
Стартовые примеры первая запись, чтение, append
1. Чтение read, фильтр, числа
2. Запись отчёт, x, копия
3. pathlib Path, glob
4. Строки split, Counter
5. CSV csv.reader, DictReader
6. JSON dump, load
7. Ошибки FileNotFoundError, cp1251
8. Задачи лог, merge, config
9. stdin < input.txt
10. Заготовки генератор
11. Ошибки шпаргалка

См. также