Перейти к основному содержимому

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

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

  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 в программу так, будто вы вводите его с клавиатуры.


Частые запросы в 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 textpathlib
python count words in file / подсчёт словПодсчёт слов
python sum numbers from fileЧтение чисел
python csv read write exampleCSV
python json load dump fileJSON
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Удобно для маленьких файлов
после блока withPython вызывает 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Проверка «есть ли подстрока в строке» — регистр важен (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.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-sigUTF-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.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 в папке

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 — escaper"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. pathlibPath, glob
4. Строкиsplit, Counter
5. CSVcsv.reader, DictReader
6. JSONdump, load
7. ОшибкиFileNotFoundError, cp1251
8. Задачилог, merge, config
9. stdin< input.txt
10. Заготовкигенератор
11. Ошибкишпаргалка

См. также


См. также

Другие статьи этого же раздела в боковом меню (как на странице "О разделе").