Python — работа с файлами и текстом
Для кого эта статья
Подборка готовых скриптов на Python 3 с разбором «что написано» и «зачем так». Материал рассчитан на:
- школьников — лабораторные по информатике, задачи «прочитать файл и посчитать…»;
- студентов — первый курс, курсовые с логами, CSV, конфигами;
- самоучек — когда в Google ищут «python read file», «python запись в txt», «python open encoding utf-8», «python read csv example»;
- тех, кто уже решал алгоритмы на Python и хочет читать вход из файла, а не с клавиатуры.
Каждый пример можно скопировать в файл .py, положить рядом тестовый .txt и запустить: python script.py.
Файловая система, HTTP и форматы данных — Работа с файлами, сетью и внешними API. Общая теория I/O — Чтение и запись. Большие таблицы — Pandas. Ввод для ЕГЭ и олимпиад — алгоритмы на Python. Сложный поиск по тексту — Regex.
Основы работы с файлами и текстом на Python
Как запустить любой пример
- Установите Python 3 (на Windows отметьте «Add python to PATH»).
- Создайте папку, например
files_lab. - Сохраните код в
read_demo.py. - Если пример читает файл — создайте этот файл в той же папке (или укажите полный путь).
- Откройте терминал в этой папке и выполните:
python read_demo.py
Проверка с готовым входом (удобно на Stepik и при отладке):
python task.py < input.txt
Символ < перенаправляет содержимое input.txt в программу так, будто вы вводите его с клавиатуры.
Частые запросы в Google — куда смотреть
| Ищут в интернете | Раздел ниже |
|---|---|
| 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 строится вокруг двух идей:
open(path, mode, encoding)— «открой файл так-то».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() | Ресурс освобождён |
Режимы, которые понадобятся чаще всего:
| Режим | Действие | Типичный запрос в Google |
|---|---|---|
"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 | Проверка «есть ли подстрока в строке» — регистр важен (python ≠ Python) |
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"{name}: {grade}\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.stat().st_size, "байт")
Разбор:
| Строка | Смысл |
|---|---|
Path(".") | Текущая рабочая папка (откуда запустили python) |
.glob("*.txt") | Все файлы с расширением .txt только здесь, без подпапок |
txt_file.name | Только имя файла, без пути |
.stat().st_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. Разбор строки на слова
line = " Python отлично подходит для скриптов "
words = line.strip().split()
print(words)
Вывод: ['Python', 'отлично', 'подходит', 'для', 'скриптов']
Разбор:
| Вызов | Результат |
|---|---|
strip() | " Python ... " → без пробелов по краям |
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 слов в статье (без учёта регистра, с грубой очисткой пунктуации).
from collections import Counter
def top_words(path: str, n: int = 5) -> list[tuple[str, int]]:
counter: Counter[str] = Counter()
with open(path, "r", encoding="utf-8") as f:
for line in f:
for word in line.lower().split():
word = word.strip(".,!?;:\"'()[]")
if word:
counter[word] += 1
return counter.most_common(n)
for word, freq in top_words("article.txt"):
print(f"{word}: {freq}")
Разбор:
| Строка | Смысл |
|---|---|
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. Запись и чтение
import json
data = {
"title": "Мой проект",
"version": 1,
"tags": ["python", "files"],
}
with open("config.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
with open("config.json", "r", encoding="utf-8") as f:
loaded = json.load(f)
print(loaded["title"])
Файл 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.stat().st_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.stat().st_size | Размер файла в байтах — 0 значит пустой |
with_suffix(... + ".bak") | report.txt → report.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)
Пример вывода: {'lines': 42, 'words': 318, 'chars': 2048}
Разбор: 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 в папке
from pathlib import Path
def longest_txt_file(folder: str) -> tuple[Path | None, int]:
best: Path | None = None
best_lines = -1
for path in Path(folder).glob("*.txt"):
with path.open("r", encoding="utf-8") as f:
count = sum(1 for _ in f)
if count > best_lines:
best_lines = count
best = path
return best, best_lines
winner, line_count = longest_txt_file(".")
if winner:
print(winner, "— строк:", line_count)
Разбор: 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.read().strip().split()
if len(data) >= 2:
a, b = int(data[0]), int(data[1])
print(a + b)
Вывод: 30
Разбор:
| Строка | Смысл |
|---|---|
sys.stdin | Поток ввода — клавиатура или перенаправленный файл |
.read() | Весь stdin до конца (EOF) |
.strip().split() | Убрать края → разбить по пробелам/переводам строк |
int(data[0]) | Первое «слово» → число |
Альтернатива — построчно (когда числа на разных строках):
import sys
lines = sys.stdin.read().strip().splitlines()
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. Ошибки | шпаргалка |
См. также
- Работа с файлами, сетью и внешними API — теория и сценарии автоматизации
- Чтение и запись — байты, page cache, режимы
open - Модули в Python —
json,csv,re - Алгоритмы на Python — ЕГЭ и олимпиадка — ввод-вывод и задачи на массивы
- Pandas — типовые операции — CSV и таблицы в аналитике
- Задачи по Python — тренировочные формулировки с ответами
- Примеры фигур Turtle — визуальные примеры для отдыха от файлов
См. также
Другие статьи этого же раздела в боковом меню (как на странице "О разделе"). Практическая карта типовых IT-задач: термины, пошаговое внедрение, проверка качества и типичные ошибки. Простой консольный чат на C# — учебное приложение с сокетами: TCP между клиентом и сервером, многопоточность и обмен сообщениями в консоли. Примеры вёрстки на HTML и CSS с разбором: центрирование, Flexbox, Grid, формы, шапка, подвал и адаптив для учебы и портфолио. Перед началом работы обязательно изучите главу Turtle . Галерея 3D-фигур на Panda3D — карточки, куб, пирамида, сфера, сетки и составные сцены; код для локального запуска. Готовые docker-compose.yml с разбором каждой строки — nginx, PostgreSQL, Redis, WordPress, MongoDB. Примеры для школьников и студентов: postgres example, поднять базу локально, app + db. Примеры nginx.conf для статики, reverse proxy, React/Vue SPA, PHP, SSL и балансировки — построчный разбор директив, проверка curl и типичные ошибки для лабораторных и VPS. dockerfile example — 10 готовых Dockerfile с построчным разбором: node, python, golang, react nginx, spring boot, php, dotnet. Для студентов, лабораторных и docker build с нуля. PromQL example — готовые запросы Prometheus и Grafana с построчным разбором: up, rate, node_exporter cpu, memory, disk, http_requests_total, histogram_quantile p99, алерты. Для студентов, лабораторных и devops docker compose. Готовые манифесты Kubernetes с разбором каждой строки — Pod, Deployment, Service, ConfigMap, Secret, Ingress. Примеры для Minikube, kind и kubectl apply. Примеры графиков Matplotlib на Python для школьников и студентов — sin, cos, парабола, столбцы, scatter, гистограмма, подграфики; код с подробным разбором. Примеры pandas на Python для школьников и студентов — DataFrame, фильтрация, groupby, очистка, merge, сводные таблицы и экспорт; код с подробным разбором каждой строки.Готовые решения
Простой консольный чат на CSharp
HTML + CSS — готовые макеты
Примеры фигур Turtle на Python
Примеры фигур Panda3D на Python
Docker Compose — готовые стеки
Nginx — конфиги под задачу
Dockerfile — 10 типовых образов
Prometheus + Grafana — запросы
Kubernetes YAML — минимальные манифесты
Matplotlib — графики
Pandas — типовые операции