open(): режимы, объект файла и контекстный менеджер
less_27__file_operation/theory_01__open.md
Полный обзор работы с файлами через open(filename, mode, encoding): таблица режимов (r/w/a/x и их бинарные и '+' варианты) с указанием, что происходит, если файла нет, и таблица всех методов объекта файла (read, readline, readlines, write, seek, tell, close). Отдельно подчёркнуто, что файл — это классический итератор (isinstance(f, Iterator) даёт True), и что ручной close() ненадёжен — предпочтителен with, который закрывает файл автоматически, включая пример с двумя контекстными менеджерами сразу для копирования файла в верхнем регистре.
- open(filename, mode, encoding) — синтаксис и три основных аргумента
- Таблица режимов: r/w/a/x и их поведение при отсутствующем файле
- isinstance(f, Iterator) — объект файла является итератором
- with open(...) as file — контекстный менеджер закрывает файл автоматически
- with (open(...) as f_in, open(...) as f_out) — два менеджера одновременно, f_out.write(f_in.read().upper())
- Таблица методов: read/read(n)/readline/readlines/write/writelines/seek/tell/flush/close
- Режимы r+/w+/a+/x+ — одновременное чтение и запись
Показать начало файла (212 строк всего)
## Что такое файл?
**Файл** — это определённый набор байтов (то есть набор 0 и 1).
Различают
* **Текстовые** файлы и
* **Бинарные** файлы
Но если и те, и другие — это набор байтов, то в чём разница?
## Функция `open()`
Функция `open()` в Python **открывает файл** и возвращает **объект файла**, через который можно:
* читать данные
* записывать данные
* добавлять данные
* перемещаться по файлу
---
## Синтаксис
```
file = open(filename, mode, encoding)
```
### Основные аргументы:
| Аргумент | Значение | Пример |
| ---------- |-------------------------------------------| ---------------------------------- |
| `file` | Путь к файлу <br>(как минимум, имя файла) | `"data.txt"` |
| `mode` | Режим работы | `"r"`, `"w"`, `"a"`, `"rb"` и т.п. |
| `encoding` | Кодировка текста | `"utf-8"`, `"cp1251"` |
Кстати, объект `file` является классическим ИТЕРАТОРОМ:
```python
from typing import Iterator
f = open('_', 'w')
print("Тип данных объекта <f>:\n", type(f))
print("Является ли объект <f> итератором?\n", isinstance(f, Iterator))
f.close()
```
---
## Режимы открытия файла (`mode`)
| Режим | Значение | Что делает | Если файла нет |
| ------ | ---------------- | ------------------------------------- | ---------------------------- |
| `"r"` | read | читать файл | ошибка |
| `"w"` | write | записать заново (стирает содержимое!) | создаст файл |
| `"a"` | append | дописать в конец | создаст файл |
| `"x"` | exclusive create | создать новый файл | ошибка, если файл существует |
| `"rb"` | read binary | читать в бинарном виде | ошибка |
| `"wb"` | write binary | записать в бинарном виде | создаст файл |
…