1. Основы ввода-вывода: open(), режимы и кодировки
Основы ввода-вывода: open(), режимы и кодировки
Работа с файлами в Python начинается с правильного открытия файла: нужно выбрать режим (что мы хотим делать с файлом) и понять, в каком виде данные будут читаться/записываться (текст или байты), а также как связана текстовая работа с кодировкой.
В этой статье вы научитесь:
open() и получать файловый объектr, w, a, x, b, t, +)withЧто такое ввод-вывод и что возвращает open()
Файлы — это внешний источник данных. Python общается с ними через потоки ввода-вывода: вы читаете данные из файла в программу и записываете из программы в файл.
Функция open() открывает файл и возвращает файловый объект (объект-поток), у которого есть методы чтения и записи.
Простейший пример:
Здесь:
open(...) — открывает файл и создаёт файловый объектread() — читает содержимоеclose() — закрывает файл и освобождает ресурсВажно: файл нужно закрывать всегда, иначе можно получить утечки ресурсов, незаписанные данные (из-за буферизации) или блокировки файла на некоторых ОС.
Почему лучше использовать with
Конструкция with использует контекстный менеджер: файл закроется автоматически даже если внутри блока возникнет ошибка.
Это базовая практика, которую стоит применять почти всегда.
Сигнатура open() и ключевые параметры
На практике чаще всего достаточно file, mode и encoding (для текста), но полезно знать основные параметры.
Пример с явными именованными аргументами:
Ключевые параметры:
file — путь к файлу (строка или объект пути)mode — режим открытия (чтение/запись/добавление, текст/байты и т.д.)encoding — кодировка только для текстового режимаerrors — стратегия обработки ошибок декодирования/кодирования ("strict", "replace", "ignore" и другие)newline — управление переводами строк в текстовом режимеОфициальная документация:
Режимы открытия: как выбрать правильный
Режим — это строка, составленная из символов. Важнее всего понять базовую операцию (r, w, a, x) и формат данных (t или b).
Базовые режимы
| Режим | Смысл | Если файла нет | Если файл есть |
|---|---|---|---|
| r | чтение | ошибка | читаем |
| w | запись | создаст | перезапишет (обнулит) |
| a | добавление в конец | создаст | допишет в конец |
| x | создать новый и писать | создаст | ошибка |
Примеры:
Текстовый и бинарный режимы
| Суффикс | Режим | Что читаем/пишем | Тип данных |
|---|---|---|---|
| t | текстовый (по умолчанию) | символы | str |
| b | бинарный | байты | bytes |
Примеры:
В бинарном режиме параметр encoding не используется (и не нужен), потому что Python не декодирует байты в текст.
Режимы с плюсом: чтение и запись
Символ + означает, что файл открыт и на чтение, и на запись.
Типичные варианты:
r+ — чтение и запись, файл должен существоватьw+ — чтение и запись, файл будет создан или перезаписанa+ — чтение и запись, запись всегда в конецМини-пример (обратите внимание на позицию указателя):
Метод seek(0) перемещает позицию чтения/записи в начало файла. Позиция важна в режимах с +.
Пути к файлам: где Python ищет файл
Если вы передаёте относительный путь, он считается относительно текущей рабочей директории (current working directory).
Пример:
Если файл «не находится», проблема часто не в open(), а в том, что программа запускается из другой папки.
Для более надёжной работы с путями часто используют pathlib:
Кодировки: как текст превращается в байты и обратно
Файл на диске хранит байты. Когда вы открываете файл в текстовом режиме (t), Python:
str с помощью encodingstr в байты с помощью encodingПочему важно явно указывать encoding
Если не указать encoding, Python выберет системную кодировку по умолчанию. Она может отличаться на разных машинах и ОС. Результат — «кракозябры» или ошибка декодирования.
Практика для учебных и большинства прикладных задач: открывать текстовые файлы так:
utf-8 — наиболее распространённая и переносимая кодировка.
Типичная ошибка: UnicodeDecodeError
Если файл сохранён в одной кодировке, а вы читаете в другой, можно получить ошибку вроде UnicodeDecodeError.
Стратегии решения:
encodingerrors="replace" (символы заменятся на `), чтобы хотя бы прочитать остальноеПример:
Используйте errors="replace" осознанно: это не «исправление файла», а компромисс, чтобы не падать с ошибкой.
Минимальные операции чтения и записи
После открытия файла в правильном режиме вы используете методы файлового объекта.
Чтение:
— прочитать всё — прочитать n символов (или байт в бинарном режиме) — прочитать одну строкуПример построчного чтения:
Запись:
— записать строку — записать набор строк (без автоматических \n)Пример:
Частые ошибки и как их избежать
, если нужно дописывать, и x, если нельзя перетирать существующий файл
Забыли указать кодировку
- В учебных и кросс-платформенных сценариях указывайте encoding="utf-8"
Читаете бинарный файл в текстовом режиме
- Для изображений, архивов, pdf и т.п. используйте rb/wb
Не закрыли файл
- Используйте with open(...) as f:Итоги
open() возвращает файловый объект, через который выполняются операции чтения/записи
Режимы определяют поведение: r/w/a/x, формат данных: t/b, совмещённый доступ: +
В текстовом режиме всегда думайте о кодировке и чаще всего указывайте encoding="utf-8"
Используйте with`, чтобы файл закрывался автоматическиВ следующих материалах курса мы будем углубляться в практику чтения и записи: построчное чтение, работа с указателем файла, обработка больших файлов и типичные шаблоны обработки данных.