> **Источник:** https://python-all.ru/3.0/library/io.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# `io` – основные инструменты для работы с потоками

Модуль `io` предоставляет интерфейсы Python для работы с потоками. Встроенная функция [`open()`](https://python-all.ru/3.0/library/functions.html#open) определена в этом модуле.

Во главе иерархии ввода-вывода находится абстрактный базовый класс [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Он определяет базовый интерфейс для потока. Однако следует отметить, что нет разделения между чтением и записью в потоках; реализации могут выбрасывать [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError), если они не поддерживают данную операцию.

Расширением [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) является [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase), который занимается просто чтением и записью необработанных байтов в поток. [`FileIO`](https://python-all.ru/3.0/library/io.html#io.FileIO) наследует [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase), чтобы предоставить интерфейс к файлам в файловой системе машины.

[`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase) занимается буферизацией на необработанном байтовом потоке ([`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase)). Его подклассы: [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter), [`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader) и [`BufferedRWPair`](https://python-all.ru/3.0/library/io.html#io.BufferedRWPair) буферизуют потоки, которые доступны для чтения, записи и для чтения и записи одновременно. [`BufferedRandom`](https://python-all.ru/3.0/library/io.html#io.BufferedRandom) предоставляет буферизованный интерфейс для потоков с произвольным доступом. [`BytesIO`](https://python-all.ru/3.0/library/io.html#io.BytesIO) – это простой поток байтов в памяти.

Ещё одним подклассом [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) является [`TextIOBase`](https://python-all.ru/3.0/library/io.html#io.TextIOBase), который занимается потоками, чьи байты представляют текст, и обрабатывает кодирование и декодирование из строк и в строки. [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper), который расширяет его, является буферизованным текстовым интерфейсом к буферизованному необработанному потоку ([`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase)). Наконец, [`StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO) – это поток в памяти для текста.

Имена аргументов не являются частью спецификации, и только аргументы [`open()`](https://python-all.ru/3.0/library/functions.html#open) предназначены для использования в качестве именованных аргументов.

## Интерфейс модуля

#### `[io.DEFAULT_BUFFER_SIZE]io.DEFAULT_BUFFER_SIZE`

Целое число, содержащее размер буфера по умолчанию, используемый буферизованными классами ввода-вывода модуля.

[`open()`](https://python-all.ru/3.0/library/functions.html#open)

использует blksize файла (получаемый с помощью

[`os.stat()`](https://python-all.ru/3.0/library/os.html#os.stat)

), если это возможно.

#### `[io.open]io.open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])`

Открывает *file* и возвращает поток. Если файл не может быть открыт, возникает [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError).

*file* – это либо строка, задающая имя (и путь, если файл не находится в текущей рабочей директории) открываемого файла, либо файловый дескриптор открываемого файла. (Если задан файловый дескриптор, например, из [`os.fdopen()`](https://python-all.ru/3.0/library/os.html#os.fdopen), он закрывается при закрытии возвращаемого объекта ввода-вывода, если только *closefd* не установлен в `False`.)

*mode* – необязательная строка, определяющая режим, в котором открывается файл. По умолчанию используется `'r'`, что означает открытие для чтения в текстовом режиме. Другие распространённые значения: `'w'` для записи (при этом файл усекается, если он уже существует) и `'a'` для добавления (что на *некоторых* системах Unix означает, что *все* операции записи добавляются в конец файла независимо от текущей позиции). В текстовом режиме, если *encoding* не указана, используемая кодировка зависит от платформы. (Для чтения и записи сырых байтов используйте двоичный режим и оставьте *encoding* неуказанным.) Доступные режимы:

| Символ | Значение |
| --- | --- |
| `'r'` | открытие для чтения (по умолчанию) |
| `'w'` | открытие для записи, с предварительным усечением файла |
| `'a'` | открытие для записи, дозапись в конец файла, если он существует |
| `'b'` | двоичный режим |
| `'t'` | текстовый режим (по умолчанию) |
| `'+'` | открывает дисковый файл для обновления (чтения и записи) |
| `'U'` | Режим универсального перевода строк (для обратной совместимости; не следует использовать в новом коде). |

Режим по умолчанию – `'rt'` (открытие для чтения текста). Для бинарного произвольного доступа режим `'w+b'` открывает и усекает файл до 0 байт, а `'r+b'` открывает файл без усечения.

Python различает файлы, открытые в двоичном и текстовом режимах, даже если базовая операционная система этого не делает. Файлы, открытые в двоичном режиме (включая `'b'` в аргументе *mode*), возвращают содержимое в виде объектов `bytes` без какого-либо декодирования. В текстовом режиме (по умолчанию, или когда `'t'` включен в аргументе *mode*) содержимое файла возвращается в виде строк, при этом байты сначала декодируются с использованием платформозависимой кодировки или указанной *encoding*, если она задана.

*buffering* – необязательное целое число, используемое для установки политики буферизации. По умолчанию включена полная буферизация. Передайте 0, чтобы отключить буферизацию (разрешено только в двоичном режиме), 1 – для построчной буферизации и целое число \> 1 – для полной буферизации.

*encoding* – это имя кодировки, используемой для декодирования или кодирования файла. Её следует использовать только в текстовом режиме. Кодировка по умолчанию зависит от платформы, но можно использовать любую кодировку, поддерживаемую Python. Смотрите модуль [`codecs`](https://python-all.ru/3.0/library/codecs.html#module-codecs) для списка поддерживаемых кодировок.

*errors* – необязательная строка, определяющая, как обрабатывать ошибки кодирования и декодирования. Передача `'strict'` вызывает исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError) при ошибке кодирования (значение по умолчанию `None` имеет тот же эффект), а `'ignore'` игнорирует ошибки. (Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.) `'replace'` вставляет замещающий символ (например, `'?'`) в места неверных данных. При записи можно использовать `'xmlcharrefreplace'` (замена соответствующей XML-ссылкой на символ) или `'backslashreplace'` (замена escape-последовательностями с обратной косой чертой). Допустимо любое другое имя обработки ошибок, зарегистрированное в [`codecs.register_error()`](https://python-all.ru/3.0/library/codecs.html#codecs.register_error).

*newline* управляет работой режима универсального перевода строк (применяется только в текстовом режиме). Может принимать значения `None`, `''`, `'\n'`, `'\r'` и `'\r\n'`. Работает следующим образом:

- При чтении, если *newline* равен `None`, включается режим универсального перевода строк. Строки во входных данных могут заканчиваться на `'\n'`, `'\r'` или `'\r\n'`, и они преобразуются в `'\n'` перед возвратом вызывающему коду. Если он равен `''`, режим универсального перевода строк также включён, но концы строк возвращаются вызывающему коду без преобразования. Если он имеет любое другое допустимое значение, входные строки завершаются только заданной строкой, и конец строки возвращается без преобразования.
- При записи, если *newline* равен `None`, все записанные символы `'\n'` преобразуются в системный разделитель строк по умолчанию [`os.linesep`](https://python-all.ru/3.0/library/os.html#os.linesep). Если *newline* равен `''`, преобразование не выполняется. Если *newline* имеет любое другое допустимое значение, все записанные символы `'\n'` преобразуются в заданную строку.

Если *closefd* равен `False` и был передан файловый дескриптор, а не имя файла, базовый файловый дескриптор останется открытым при закрытии файла. Если передано имя файла, *closefd* не действует, но должно быть равно `True` (значение по умолчанию).

Тип файлового объекта, возвращаемого функцией [`open()`](https://python-all.ru/3.0/library/functions.html#open), зависит от режима. Когда [`open()`](https://python-all.ru/3.0/library/functions.html#open) используется для открытия файла в текстовом режиме (`'w'`, `'r'`, `'wt'`, `'rt'` и т.д.), она возвращает [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper). При использовании для открытия файла в двоичном режиме возвращаемый класс различается: в двоичном режиме чтения он возвращает [`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader); в режимах двоичной записи и двоичного добавления – [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter), а в режиме чтения/записи – [`BufferedRandom`](https://python-all.ru/3.0/library/io.html#io.BufferedRandom).

Также можно использовать строку или bytearray в качестве файла как для чтения, так и для записи. Для строк [`StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO) можно использовать как файл, открытый в текстовом режиме, а для bytearray – [`BytesIO`](https://python-all.ru/3.0/library/io.html#io.BytesIO) как файл, открытый в двоичном режиме.

#### `[io.BlockingIOError]exception io.BlockingIOError`

Исключение, возникающее при блокировке неблокирующего потока. Наследует [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError).

В дополнение к атрибутам [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError), [`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) имеет один атрибут:

#### `[io.BlockingIOError.characters_written]characters_written`

Целое число, содержащее количество символов, записанных в поток до его блокировки.

#### `[io.UnsupportedOperation]exception io.UnsupportedOperation`

Исключение, наследующее

[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)

и

[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)

, которое возбуждается при вызове неподдерживаемой операции над потоком.

## Базовые классы ввода-вывода

#### `[io.IOBase]class io.IOBase`

Абстрактный базовый класс для всех классов ввода-вывода, работающий с потоками байтов. Отсутствует открытый конструктор.

Этот класс предоставляет пустые абстрактные реализации для многих методов, которые производные классы могут выборочно переопределять; реализации по умолчанию представляют файл, который нельзя читать, записывать или позиционировать.

Хотя [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) не объявляет `read()`, `readinto()`, или `write()`, поскольку их сигнатуры различаются, реализации и клиенты должны считать эти методы частью интерфейса. Кроме того, реализации могут возбуждать [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError) при вызове неподдерживаемых операций.

Базовым типом для двоичных данных, читаемых из файла или записываемых в файл, является [`bytes`](https://python-all.ru/3.0/library/functions.html#bytes). Типы [`bytearray`](https://python-all.ru/3.0/library/functions.html#bytearray) также принимаются, а в некоторых случаях (например, `readinto`) требуются. Классы текстового ввода-вывода работают с данными типа [`str`](https://python-all.ru/3.0/library/functions.html#str).

Обратите внимание, что вызов любого метода (даже запросов) на закрытом потоке является неопределённым поведением. Реализации могут возбуждать [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError) в этом случае.

IOBase (и его подклассы) поддерживают протокол итератора, что означает, что объект [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) можно итерировать, получая строки из потока.

IOBase также является контекстным менеджером и поэтому поддерживает оператор [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with). В этом примере *file* закрывается после завершения блока оператора [`with`](https://python-all.ru/3.0/reference/compound_stmts.html#with) – даже если возникло исключение:

```python
with open('spam.txt', 'w') as file:
    file.write('Spam and eggs!')
```

[`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) предоставляет следующие атрибуты данных и методы:

#### `[io.IOBase.close]close()`

Сбрасывает буферы и закрывает этот поток. Этот метод не действует, если файл уже закрыт. После закрытия файла любая операция с файлом (например, чтение или запись) вызовет

[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)

. Внутренний файловый дескриптор не закрывается, если

*closefd*

было равно False.

#### `[io.IOBase.closed]closed`

True, если поток закрыт.

#### `[io.IOBase.fileno]fileno()`

Возвращает базовый файловый дескриптор (целое число) потока, если он существует. Если объект ввода-вывода не использует файловый дескриптор, возбуждается

[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)

.

#### `[io.IOBase.flush]flush()`

Сбрасывает буферы записи потока, если это применимо. Для потоков только для чтения и неблокирующих потоков эта операция ничего не делает.

#### `[io.IOBase.isatty]isatty()`

Возвращает

`True`

, если поток интерактивный (т.е. подключен к терминалу/tty-устройству).

#### `[io.IOBase.readable]readable()`

Возвращает

`True`

, если из потока можно читать. Если False,

`read()`

возбудит

[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)

.

#### `[io.IOBase.readline]readline([limit])`

Читает и возвращает одну строку из потока. Если указан *limit*, будет прочитано не более *limit* байт.

Для двоичных файлов признаком конца строки всегда является `b'\n'`; для текстовых файлов через параметр *newlines* функции [`open()`](https://python-all.ru/3.0/library/functions.html#open) можно указать, какие признаки конца строки распознавать.

#### `[io.IOBase.readlines]readlines([hint])`

Читает и возвращает список строк из потока. Можно указать

*hint*

для ограничения количества читаемых строк: чтение прекратится, когда общий размер (в байтах/символах) всех прочитанных строк превысит

*hint*

.

#### `[io.IOBase.seek]seek(offset[, whence])`

Изменяет позицию в потоке на заданное смещение в байтах *offset*. *offset* интерпретируется относительно позиции, задаваемой параметром *whence*. Допустимые значения *whence*:

- `0` – начало потока (по умолчанию); *offset* должен быть нулевым или положительным
- `1` – текущая позиция в потоке; *offset* может быть отрицательным
- `2` – конец потока; *offset* обычно отрицательный

Возвращает новую абсолютную позицию.

#### `[io.IOBase.seekable]seekable()`

Возвращает

`True`

, если поток поддерживает произвольный доступ. Если

`False`

,

[`seek()`](https://python-all.ru/3.0/library/io.html#io.IOBase.seek)

,

[`tell()`](https://python-all.ru/3.0/library/io.html#io.IOBase.tell)

и

[`truncate()`](https://python-all.ru/3.0/library/io.html#io.IOBase.truncate)

возбудят

[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)

.

#### `[io.IOBase.tell]tell()`

Возвращает текущую позицию в потоке.

#### `[io.IOBase.truncate]truncate([size])`

Усекает файл до не более чем

*size*

байт.

*size*

по умолчанию равна текущей позиции в файле, возвращаемой

[`tell()`](https://python-all.ru/3.0/library/io.html#io.IOBase.tell)

.

#### `[io.IOBase.writable]writable()`

Возвращает

`True`

, если поток поддерживает запись. Если

`False`

,

`write()`

и

[`truncate()`](https://python-all.ru/3.0/library/io.html#io.IOBase.truncate)

возбудят

[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)

.

#### `[io.IOBase.writelines]writelines(lines)`

Записывает список строк в поток. Разделители строк не добавляются, поэтому обычно каждая переданная строка уже содержит разделитель в конце.

#### `[io.RawIOBase]class io.RawIOBase`

Базовый класс для необработанного бинарного ввода-вывода. Наследует [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Открытого конструктора нет.

В дополнение к атрибутам и методам из [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase), RawIOBase предоставляет следующие методы:

#### `[io.RawIOBase.read]read([n])`

Читает и возвращает все байты из потока до EOF, или, если указано

*n*

, до

*n*

байт. Выполняется только один системный вызов. Пустой объект bytes возвращается при EOF;

`None`

возвращается, если объект настроен не блокироваться и нет данных для чтения.

#### `[io.RawIOBase.readall]readall()`

Читает и возвращает все байты из потока до EOF, при необходимости выполняя несколько вызовов к потоку.

#### `[io.RawIOBase.readinto]readinto(b)`

Читает до len(b) байтов в bytearray

*b*

и возвращает количество прочитанных байтов.

#### `[io.RawIOBase.write]write(b)`

Записывает переданный объект bytes или bytearray,

*b*

, в нижележащий небуферизованный поток и возвращает количество записанных байт (оно никогда не меньше

`len(b)`

, так как в случае неудачи записи будет возбуждено

[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)

).

## Сырой файловый ввод-вывод

#### `[io.FileIO]class io.FileIO(name[, mode])`

[`FileIO`](https://python-all.ru/3.0/library/io.html#io.FileIO) представляет файл, содержащий байтовые данные. Он реализует интерфейс [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase) (а значит, и интерфейс [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) тоже).

Параметр *mode* может быть равен `'r'`, `'w'` или `'a'` для чтения (по умолчанию), записи или дозаписи. Файл будет создан, если он не существует, при открытии на запись или дозапись; при открытии на запись файл будет усечён. Добавление `'+'` к режиму позволяет одновременно читать и писать.

В дополнение к атрибутам и методам от [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) и [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase), [`FileIO`](https://python-all.ru/3.0/library/io.html#io.FileIO) предоставляет следующие атрибуты и методы:

#### `[io.FileIO.mode]mode`

Режим, указанный в конструкторе.

#### `[io.FileIO.name]name`

Имя файла. Это дескриптор файла, если имя не указано в конструкторе.

#### `[io.FileIO.read]read([n])`

Читает и возвращает не более

*n*

байт. Выполняется только один системный вызов, поэтому возможно, что возвращается меньше данных, чем запрошено. Используйте

[`len()`](https://python-all.ru/3.0/library/functions.html#len)

для возвращённого объекта bytes, чтобы узнать, сколько байт было получено. (В неблокирующем режиме

`None`

возвращается, когда нет доступных данных.)

#### `[io.FileIO.readall]readall()`

Читает и возвращает всё содержимое файла в виде одного объекта bytes. В неблокирующем режиме возвращается столько, сколько сразу доступно. Если достигнут EOF, возвращается

`b''`

.

#### `[io.FileIO.write]write(b)`

Записывает объект bytes или bytearray,

*b*

, в файл и возвращает количество реально записанных байт. Выполняется только один системный вызов, поэтому возможно, что записана только часть данных.

Обратите внимание, что унаследованный метод `readinto()` не следует использовать для объектов [`FileIO`](https://python-all.ru/3.0/library/io.html#io.FileIO).

## Буферизированные потоки

#### `[io.BufferedIOBase]class io.BufferedIOBase`

Базовый класс для потоков, поддерживающих буферизацию. Он наследует [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Открытого конструктора нет.

Основное отличие от [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase) заключается в том, что метод [`read()`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase.read) позволяет опускать аргумент *size* и не имеет реализации по умолчанию, которая делегирует вызов [`readinto()`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase.readinto).

Кроме того, [`read()`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase.read), [`readinto()`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase.readinto) и [`write()`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase.write) могут возбуждать [`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError), если нижележащий сырой поток находится в неблокирующем режиме и не готов; в отличие от их сырых аналогов, они никогда не возвращают `None`.

Типичная реализация не должна наследовать от реализации [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase), а оборачивать такую, как [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter) и [`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader).

[`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase) предоставляет или переопределяет следующие методы в дополнение к методам из [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase):

#### `[io.BufferedIOBase.read]read([n])`

Читает и возвращает не более *n* байтов. Если аргумент опущен, равен `None` или отрицателен, данные читаются и возвращаются до достижения EOF. Если поток уже находится в конце, возвращается пустой объект bytes.

Если аргумент положителен, а базовый сырой поток не является интерактивным, может быть выполнено несколько сырых чтений, чтобы обеспечить требуемое количество байт (если только не достигнут EOF). Но для интерактивных сырых потоков будет выполнено не более одного сырого чтения, и короткий результат не означает, что EOF неизбежен.

[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) возбуждается, если нижележащий сырой поток на данный момент не имеет данных.

#### `[io.BufferedIOBase.readinto]readinto(b)`

Читает до len(b) байтов в bytearray *b* и возвращает количество прочитанных байтов.

Как и в случае с [`read()`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase.read), к нижележащему сырому потоку может быть выполнено несколько чтений, если только он не является «интерактивным».

[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) возбуждается, если нижележащий сырой поток на данный момент не имеет данных.

#### `[io.BufferedIOBase.write]write(b)`

Записывает переданный объект bytes или bytearray, *b*, в нижележащий сырой поток и возвращает количество записанных байт (не меньше `len(b)`, так как при сбое записи будет возбуждено [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)).

[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) возбуждается, если буфер заполнен, а нижележащий сырой поток в данный момент не может принять больше данных.

#### `[io.BytesIO]class io.BytesIO([initial_bytes])`

Реализация потока, использующая буфер байт в памяти. Наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).

Аргумент *initial\_bytes* – необязательный исходный bytearray.

[`BytesIO`](https://python-all.ru/3.0/library/io.html#io.BytesIO) предоставляет или переопределяет следующие методы в дополнение к методам из [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase) и [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase):

#### `[io.BytesIO.getvalue]getvalue()`

Возвращает объект

`bytes`

, содержащий всё содержимое буфера.

#### `[io.BytesIO.read1]read1()`

В

[`BytesIO`](https://python-all.ru/3.0/library/io.html#io.BytesIO)

это эквивалентно

`read()`

.

#### `[io.BytesIO.truncate]truncate([size])`

Усекает буфер до размера не более

*size*

байт.

*size*

по умолчанию равен текущей позиции в потоке, возвращаемой

`tell()`

.

#### `[io.BufferedReader]class io.BufferedReader(raw[, buffer_size])`

Буфер для читаемого последовательного объекта [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase). Он наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).

Конструктор создаёт [`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader) для переданного читаемого потока *raw* и *buffer\_size*. Если *buffer\_size* опущен, используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.0/library/io.html#io.DEFAULT_BUFFER_SIZE).

[`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader) предоставляет или переопределяет следующие методы в дополнение к методам из [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase) и [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase):

#### `[io.BufferedReader.peek]peek([n])`

Возвращает 1 байт (или

*n*

, если указано) из буфера без продвижения позиции. Для удовлетворения вызова выполняется только одно чтение из сырого потока. Количество возвращённых байт может быть меньше запрошенного, так как возвращается не более всех байт буфера от текущей позиции до конца.

#### `[io.BufferedReader.read]read([n])`

Читает и возвращает

*n*

байт, или, если

*n*

не указан или отрицателен, до EOF или если вызов чтения заблокируется в неблокирующем режиме.

#### `[io.BufferedReader.read1]read1(n)`

Читает и возвращает до

*n*

байт, выполняя только один вызов небуферизованного потока. Если в буфере есть хотя бы один байт, возвращаются только буферизованные байты. В противном случае выполняется один вызов чтения небуферизованного потока.

#### `[io.BufferedWriter]class io.BufferedWriter(raw[, buffer_size[, max_buffer_size]])`

Буфер для записываемого последовательного объекта RawIO. Он наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).

Конструктор создаёт [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter) для заданного записываемого потока *raw*. Если *buffer\_size* не указан, по умолчанию используется `DEAFULT_BUFFER_SIZE`. Если *max\_buffer\_size* опущен, по умолчанию он равен двум размерам буфера.

[`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter) предоставляет или переопределяет следующие методы в дополнение к методам из [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase) и [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase):

#### `[io.BufferedWriter.flush]flush()`

Принудительно сбрасывает байты, находящиеся в буфере, в необработанный поток. Если необработанный поток блокируется, должно быть возбуждено исключение

[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError)

.

#### `[io.BufferedWriter.write]write(b)`

Записывает объект bytes или bytearray,

*b*

, в сырой поток и возвращает количество записанных байт.

[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError)

возбуждается, когда сырой поток блокируется.

#### `[io.BufferedRWPair]class io.BufferedRWPair(reader, writer[, buffer_size[, max_buffer_size]])`

Объединённый буферизованный объект для записи и чтения для сырого потока, с которого можно читать и в который можно писать. Он поддерживает как `read()`, так и `write()`, и их варианты. Это полезно для сокетов и двусторонних каналов. Он наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).

*reader* и *writer* – это объекты [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase), доступные для чтения и записи соответственно. Если *buffer\_size* опущен, по умолчанию используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.0/library/io.html#io.DEFAULT_BUFFER_SIZE). *max\_buffer\_size* (для буферизованного писателя) по умолчанию равен двойному размеру буфера.

[`BufferedRWPair`](https://python-all.ru/3.0/library/io.html#io.BufferedRWPair) реализует все методы [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).

#### `[io.BufferedRandom]class io.BufferedRandom(raw[, buffer_size[, max_buffer_size]])`

Буферизированный интерфейс для потоков с произвольным доступом. Он наследует [`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader) и [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter).

Конструктор создаёт средство чтения и записи для потока raw с произвольным доступом, заданного в первом аргументе. Если *buffer\_size* опущен, по умолчанию используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.0/library/io.html#io.DEFAULT_BUFFER_SIZE). *max\_buffer\_size* (для буферизированного средства записи) по умолчанию равен удвоенному размеру буфера.

[`BufferedRandom`](https://python-all.ru/3.0/library/io.html#io.BufferedRandom) способен на всё, что могут [`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader) или [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter).

## Текстовый ввод-вывод

#### `[io.TextIOBase]class io.TextIOBase`

Базовый класс для текстовых потоков. Этот класс предоставляет посимвольный и построчный интерфейс для потокового ввода-вывода. Метод `readinto()` отсутствует, поскольку строки Python неизменяемы. Он наследует [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Открытый конструктор отсутствует.

[`TextIOBase`](https://python-all.ru/3.0/library/io.html#io.TextIOBase) предоставляет или переопределяет следующие атрибуты данных и методы в дополнение к унаследованным от [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase):

#### `[io.TextIOBase.encoding]encoding`

Имя кодировки, используемой для декодирования байтов потока в строки и для кодирования строк в байты.

#### `[io.TextIOBase.newlines]newlines`

Строка, кортеж строк или

`None`

, указывающий на переведённые к настоящему моменту символы новой строки.

#### `[io.TextIOBase.read]read(n)`

Читает не более

*n*

символов из потока и возвращает их в виде одной строки

[`str`](https://python-all.ru/3.0/library/functions.html#str)

. Если

*n*

отрицательно или

`None`

, чтение выполняется до конца файла.

#### `[io.TextIOBase.readline]readline()`

Читает до символа новой строки или конца файла и возвращает одну строку

`str`

. Если поток уже достиг конца файла, возвращается пустая строка.

#### `[io.TextIOBase.write]write(s)`

Записывает строку

*s*

в поток и возвращает количество записанных символов.

#### `[io.TextIOWrapper]class io.TextIOWrapper(buffer[, encoding[, errors[, newline[, line_buffering]]]])`

Буферизированный текстовый поток поверх raw-потока [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase), *buffer*. Он наследует [`TextIOBase`](https://python-all.ru/3.0/library/io.html#io.TextIOBase).

*encoding* задаёт имя кодировки, в которую будет декодироваться или кодироваться поток. По умолчанию используется [`locale.getpreferredencoding()`](https://python-all.ru/3.0/library/locale.html#locale.getpreferredencoding).

*errors* – необязательная строка, определяющая, как обрабатывать ошибки кодирования и декодирования. Передача `'strict'` вызывает исключение [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError) при ошибке кодирования (значение по умолчанию `None` имеет тот же эффект), а `'ignore'` игнорирует ошибки. (Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.) `'replace'` вставляет замещающий символ (например, `'?'`) в места неверных данных. При записи можно использовать `'xmlcharrefreplace'` (замена соответствующей XML-ссылкой на символ) или `'backslashreplace'` (замена escape-последовательностями с обратной косой чертой). Допустимо любое другое имя обработки ошибок, зарегистрированное в [`codecs.register_error()`](https://python-all.ru/3.0/library/codecs.html#codecs.register_error).

*newline* может принимать значения `None`, `''`, `'\n'`, `'\r'`, или `'\r\n'`. Он управляет обработкой концов строк. Если он равен `None`, включается универсальный режим новых строк (universal newlines). В этом режиме при вводе концы строк `'\n'`, `'\r'` или `'\r\n'` преобразуются в `'\n'` перед возвратом вызывающей стороне. Напротив, при выводе `'\n'` преобразуется в системный разделитель строк по умолчанию, [`os.linesep`](https://python-all.ru/3.0/library/os.html#os.linesep). Если *newline* имеет любое другое допустимое значение, то при чтении файла этот символ становится концом строки и возвращается без преобразования. При выводе `'\n'` преобразуется в *newline*.

Если *line\_buffering* равно `True`, `flush()` подразумевается при вызове write, содержащем символ новой строки.

[`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper) предоставляет следующие атрибуты данных в дополнение к атрибутам [`TextIOBase`](https://python-all.ru/3.0/library/io.html#io.TextIOBase) и его родительских классов:

#### `[io.TextIOWrapper.errors]errors`

Настройка обработки ошибок кодирования и декодирования.

#### `[io.TextIOWrapper.line_buffering]line_buffering`

Определяет, включена ли построчная буферизация.

#### `[io.StringIO]class io.StringIO([initial_value[, encoding[, errors[, newline]]]])`

Поток в памяти для текста. Он наследует [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper).

Создаёт новый поток StringIO с начальным значением, кодировкой, обработкой ошибок и настройкой символов новой строки. Подробнее см. конструктор [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper).

[`StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO) предоставляет следующий метод в дополнение к методам [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper) и его родительских классов:

#### `[io.StringIO.getvalue]getvalue()`

Возвращает

`str`

, содержащую полное содержимое буфера в любой момент до вызова метода

`close()`

объекта

[`StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO)

.

Пример использования:

```python
import io

output = io.StringIO()
output.write('First line.\n')
print('Second line.', file=output)

# Извлечь содержимое файла – это будет
# 'Первая строка.
Вторая строка.
'
contents = output.getvalue()

# Закрыть объект и освободить буфер памяти –
# .getvalue() теперь будет вызывать исключение.
output.close()
```

#### `[io.IncrementalNewlineDecoder]class io.IncrementalNewlineDecoder`

Вспомогательный кодек, декодирующий концы строк для универсального режима концов строк. Он наследует

[`codecs.IncrementalDecoder`](https://python-all.ru/3.0/library/codecs.html#codecs.IncrementalDecoder)

.
