Работа с файлами
with open("data.txt", "w", encoding="utf-8") as f: f.write("первая строка\n") f.write("вторая строка\n")with open("data.txt", "r", encoding="utf-8") as f: content = f.read() print(content)Всегда указывайте encoding явно — кодировка по умолчанию зависит от системы.
Режимы открытия
| Режим | Описание |
|---|---|
r | Чтение (по умолчанию) |
w | Запись, файл очищается |
a | Дописывание в конец |
x | Создание, ошибка если файл существует |
b | Бинарный режим, например rb |
Чтение по строкам
with open("data.txt", encoding="utf-8") as f: for line in f: print(line.rstrip())with open("data.txt", encoding="utf-8") as f: lines = f.readlines()Построчный перебор не загружает файл целиком в память.
Бинарные файлы
with open("image.png", "rb") as f: header = f.read(8) print(header)Модуль pathlib
from pathlib import Pathpath = Path("folder") / "data.txt"path.parent.mkdir(exist_ok=True)path.write_text("текст", encoding="utf-8")print(path.read_text(encoding="utf-8"))print(path.exists())print(path.suffix)print(path.stem)for item in Path(".").glob("*.py"): print(item.name)JSON
import jsondata = {"name": "Anna", "scores": [5, 4, 5]}with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2)with open("data.json", encoding="utf-8") as f: loaded = json.load(f)text = json.dumps(data)back = json.loads(text)Исключения
Ошибки времени выполнения представлены исключениями:
try: value = int(input("Число: ")) print(10 / value)except ValueError: print("Это не число")except ZeroDivisionError: print("Деление на ноль")else: print("Ошибок не было")finally: print("Выполняется всегда")Можно перехватывать несколько типов и получать сам объект исключения:
try: open("missing.txt")except (FileNotFoundError, PermissionError) as e: print(type(e).__name__, e)Не используйте голый except: — он перехватывает даже KeyboardInterrupt. Если нужен общий перехват, пишите except Exception.
Генерация исключений
def set_age(age): if age < 0: raise ValueError("возраст не может быть отрицательным") return ageПользовательские исключения
class ConfigError(Exception): passclass MissingKeyError(ConfigError): def __init__(self, key): super().__init__(f"отсутствует ключ: {key}") self.key = keytry: raise MissingKeyError("token")except ConfigError as e: print(e)Иерархия
Все исключения наследуются от BaseException. Прикладные ошибки наследуются от Exception. Часто встречаются: ValueError, TypeError, KeyError, IndexError, AttributeError, OSError.
Контекстные менеджеры
Конструкция with гарантирует освобождение ресурсов. Свой менеджер можно написать через contextlib:
from contextlib import contextmanager@contextmanagerdef opened(name): f = open(name, encoding="utf-8") try: yield f finally: f.close()with opened("data.txt") as f: print(f.read())Задания
- Прочитайте текстовый файл и подсчитайте количество строк и слов.
- Напишите функцию, которая безопасно читает JSON-файл и возвращает пустой словарь, если файл отсутствует или повреждён.
