io.md
1> **Источник:** https://python-all.ru/3.0/library/io.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `io` – основные инструменты для работы с потоками89Модуль `io` предоставляет интерфейсы Python для работы с потоками. Встроенная функция [`open()`](https://python-all.ru/3.0/library/functions.html#open) определена в этом модуле.1011Во главе иерархии ввода-вывода находится абстрактный базовый класс [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Он определяет базовый интерфейс для потока. Однако следует отметить, что нет разделения между чтением и записью в потоках; реализации могут выбрасывать [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError), если они не поддерживают данную операцию.1213Расширением [`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), чтобы предоставить интерфейс к файлам в файловой системе машины.1415[`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) – это простой поток байтов в памяти.1617Ещё одним подклассом [`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) – это поток в памяти для текста.1819Имена аргументов не являются частью спецификации, и только аргументы [`open()`](https://python-all.ru/3.0/library/functions.html#open) предназначены для использования в качестве именованных аргументов.2021## Интерфейс модуля2223#### `[io.DEFAULT_BUFFER_SIZE]io.DEFAULT_BUFFER_SIZE`2425Целое число, содержащее размер буфера по умолчанию, используемый буферизованными классами ввода-вывода модуля.2627[`open()`](https://python-all.ru/3.0/library/functions.html#open)2829использует blksize файла (получаемый с помощью3031[`os.stat()`](https://python-all.ru/3.0/library/os.html#os.stat)3233), если это возможно.3435#### `[io.open]io.open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])`3637Открывает *file* и возвращает поток. Если файл не может быть открыт, возникает [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError).3839*file* – это либо строка, задающая имя (и путь, если файл не находится в текущей рабочей директории) открываемого файла, либо файловый дескриптор открываемого файла. (Если задан файловый дескриптор, например, из [`os.fdopen()`](https://python-all.ru/3.0/library/os.html#os.fdopen), он закрывается при закрытии возвращаемого объекта ввода-вывода, если только *closefd* не установлен в `False`.)4041*mode* – необязательная строка, определяющая режим, в котором открывается файл. По умолчанию используется `'r'`, что означает открытие для чтения в текстовом режиме. Другие распространённые значения: `'w'` для записи (при этом файл усекается, если он уже существует) и `'a'` для добавления (что на *некоторых* системах Unix означает, что *все* операции записи добавляются в конец файла независимо от текущей позиции). В текстовом режиме, если *encoding* не указана, используемая кодировка зависит от платформы. (Для чтения и записи сырых байтов используйте двоичный режим и оставьте *encoding* неуказанным.) Доступные режимы:4243| Символ | Значение |44| --- | --- |45| `'r'` | открытие для чтения (по умолчанию) |46| `'w'` | открытие для записи, с предварительным усечением файла |47| `'a'` | открытие для записи, дозапись в конец файла, если он существует |48| `'b'` | двоичный режим |49| `'t'` | текстовый режим (по умолчанию) |50| `'+'` | открывает дисковый файл для обновления (чтения и записи) |51| `'U'` | Режим универсального перевода строк (для обратной совместимости; не следует использовать в новом коде). |5253Режим по умолчанию – `'rt'` (открытие для чтения текста). Для бинарного произвольного доступа режим `'w+b'` открывает и усекает файл до 0 байт, а `'r+b'` открывает файл без усечения.5455Python различает файлы, открытые в двоичном и текстовом режимах, даже если базовая операционная система этого не делает. Файлы, открытые в двоичном режиме (включая `'b'` в аргументе *mode*), возвращают содержимое в виде объектов `bytes` без какого-либо декодирования. В текстовом режиме (по умолчанию, или когда `'t'` включен в аргументе *mode*) содержимое файла возвращается в виде строк, при этом байты сначала декодируются с использованием платформозависимой кодировки или указанной *encoding*, если она задана.5657*buffering* – необязательное целое число, используемое для установки политики буферизации. По умолчанию включена полная буферизация. Передайте 0, чтобы отключить буферизацию (разрешено только в двоичном режиме), 1 – для построчной буферизации и целое число \> 1 – для полной буферизации.5859*encoding* – это имя кодировки, используемой для декодирования или кодирования файла. Её следует использовать только в текстовом режиме. Кодировка по умолчанию зависит от платформы, но можно использовать любую кодировку, поддерживаемую Python. Смотрите модуль [`codecs`](https://python-all.ru/3.0/library/codecs.html#module-codecs) для списка поддерживаемых кодировок.6061*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).6263*newline* управляет работой режима универсального перевода строк (применяется только в текстовом режиме). Может принимать значения `None`, `''`, `'\n'`, `'\r'` и `'\r\n'`. Работает следующим образом:6465- При чтении, если *newline* равен `None`, включается режим универсального перевода строк. Строки во входных данных могут заканчиваться на `'\n'`, `'\r'` или `'\r\n'`, и они преобразуются в `'\n'` перед возвратом вызывающему коду. Если он равен `''`, режим универсального перевода строк также включён, но концы строк возвращаются вызывающему коду без преобразования. Если он имеет любое другое допустимое значение, входные строки завершаются только заданной строкой, и конец строки возвращается без преобразования.66- При записи, если *newline* равен `None`, все записанные символы `'\n'` преобразуются в системный разделитель строк по умолчанию [`os.linesep`](https://python-all.ru/3.0/library/os.html#os.linesep). Если *newline* равен `''`, преобразование не выполняется. Если *newline* имеет любое другое допустимое значение, все записанные символы `'\n'` преобразуются в заданную строку.6768Если *closefd* равен `False` и был передан файловый дескриптор, а не имя файла, базовый файловый дескриптор останется открытым при закрытии файла. Если передано имя файла, *closefd* не действует, но должно быть равно `True` (значение по умолчанию).6970Тип файлового объекта, возвращаемого функцией [`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).7172Также можно использовать строку или 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) как файл, открытый в двоичном режиме.7374#### `[io.BlockingIOError]exception io.BlockingIOError`7576Исключение, возникающее при блокировке неблокирующего потока. Наследует [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError).7778В дополнение к атрибутам [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError), [`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) имеет один атрибут:7980#### `[io.BlockingIOError.characters_written]characters_written`8182Целое число, содержащее количество символов, записанных в поток до его блокировки.8384#### `[io.UnsupportedOperation]exception io.UnsupportedOperation`8586Исключение, наследующее8788[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)8990и9192[`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError)9394, которое возбуждается при вызове неподдерживаемой операции над потоком.9596## Базовые классы ввода-вывода9798#### `[io.IOBase]class io.IOBase`99100Абстрактный базовый класс для всех классов ввода-вывода, работающий с потоками байтов. Отсутствует открытый конструктор.101102Этот класс предоставляет пустые абстрактные реализации для многих методов, которые производные классы могут выборочно переопределять; реализации по умолчанию представляют файл, который нельзя читать, записывать или позиционировать.103104Хотя [`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) при вызове неподдерживаемых операций.105106Базовым типом для двоичных данных, читаемых из файла или записываемых в файл, является [`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).107108Обратите внимание, что вызов любого метода (даже запросов) на закрытом потоке является неопределённым поведением. Реализации могут возбуждать [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError) в этом случае.109110IOBase (и его подклассы) поддерживают протокол итератора, что означает, что объект [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) можно итерировать, получая строки из потока.111112IOBase также является контекстным менеджером и поэтому поддерживает оператор [`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) – даже если возникло исключение:113114```python115with open('spam.txt', 'w') as file:116 file.write('Spam and eggs!')117```118119[`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase) предоставляет следующие атрибуты данных и методы:120121#### `[io.IOBase.close]close()`122123Сбрасывает буферы и закрывает этот поток. Этот метод не действует, если файл уже закрыт. После закрытия файла любая операция с файлом (например, чтение или запись) вызовет124125[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)126127. Внутренний файловый дескриптор не закрывается, если128129*closefd*130131было равно False.132133#### `[io.IOBase.closed]closed`134135True, если поток закрыт.136137#### `[io.IOBase.fileno]fileno()`138139Возвращает базовый файловый дескриптор (целое число) потока, если он существует. Если объект ввода-вывода не использует файловый дескриптор, возбуждается140141[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)142143.144145#### `[io.IOBase.flush]flush()`146147Сбрасывает буферы записи потока, если это применимо. Для потоков только для чтения и неблокирующих потоков эта операция ничего не делает.148149#### `[io.IOBase.isatty]isatty()`150151Возвращает152153`True`154155, если поток интерактивный (т.е. подключен к терминалу/tty-устройству).156157#### `[io.IOBase.readable]readable()`158159Возвращает160161`True`162163, если из потока можно читать. Если False,164165`read()`166167возбудит168169[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)170171.172173#### `[io.IOBase.readline]readline([limit])`174175Читает и возвращает одну строку из потока. Если указан *limit*, будет прочитано не более *limit* байт.176177Для двоичных файлов признаком конца строки всегда является `b'\n'`; для текстовых файлов через параметр *newlines* функции [`open()`](https://python-all.ru/3.0/library/functions.html#open) можно указать, какие признаки конца строки распознавать.178179#### `[io.IOBase.readlines]readlines([hint])`180181Читает и возвращает список строк из потока. Можно указать182183*hint*184185для ограничения количества читаемых строк: чтение прекратится, когда общий размер (в байтах/символах) всех прочитанных строк превысит186187*hint*188189.190191#### `[io.IOBase.seek]seek(offset[, whence])`192193Изменяет позицию в потоке на заданное смещение в байтах *offset*. *offset* интерпретируется относительно позиции, задаваемой параметром *whence*. Допустимые значения *whence*:194195- `0` – начало потока (по умолчанию); *offset* должен быть нулевым или положительным196- `1` – текущая позиция в потоке; *offset* может быть отрицательным197- `2` – конец потока; *offset* обычно отрицательный198199Возвращает новую абсолютную позицию.200201#### `[io.IOBase.seekable]seekable()`202203Возвращает204205`True`206207, если поток поддерживает произвольный доступ. Если208209`False`210211,212213[`seek()`](https://python-all.ru/3.0/library/io.html#io.IOBase.seek)214215,216217[`tell()`](https://python-all.ru/3.0/library/io.html#io.IOBase.tell)218219и220221[`truncate()`](https://python-all.ru/3.0/library/io.html#io.IOBase.truncate)222223возбудят224225[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)226227.228229#### `[io.IOBase.tell]tell()`230231Возвращает текущую позицию в потоке.232233#### `[io.IOBase.truncate]truncate([size])`234235Усекает файл до не более чем236237*size*238239байт.240241*size*242243по умолчанию равна текущей позиции в файле, возвращаемой244245[`tell()`](https://python-all.ru/3.0/library/io.html#io.IOBase.tell)246247.248249#### `[io.IOBase.writable]writable()`250251Возвращает252253`True`254255, если поток поддерживает запись. Если256257`False`258259,260261`write()`262263и264265[`truncate()`](https://python-all.ru/3.0/library/io.html#io.IOBase.truncate)266267возбудят268269[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)270271.272273#### `[io.IOBase.writelines]writelines(lines)`274275Записывает список строк в поток. Разделители строк не добавляются, поэтому обычно каждая переданная строка уже содержит разделитель в конце.276277#### `[io.RawIOBase]class io.RawIOBase`278279Базовый класс для необработанного бинарного ввода-вывода. Наследует [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Открытого конструктора нет.280281В дополнение к атрибутам и методам из [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase), RawIOBase предоставляет следующие методы:282283#### `[io.RawIOBase.read]read([n])`284285Читает и возвращает все байты из потока до EOF, или, если указано286287*n*288289, до290291*n*292293байт. Выполняется только один системный вызов. Пустой объект bytes возвращается при EOF;294295`None`296297возвращается, если объект настроен не блокироваться и нет данных для чтения.298299#### `[io.RawIOBase.readall]readall()`300301Читает и возвращает все байты из потока до EOF, при необходимости выполняя несколько вызовов к потоку.302303#### `[io.RawIOBase.readinto]readinto(b)`304305Читает до len(b) байтов в bytearray306307*b*308309и возвращает количество прочитанных байтов.310311#### `[io.RawIOBase.write]write(b)`312313Записывает переданный объект bytes или bytearray,314315*b*316317, в нижележащий небуферизованный поток и возвращает количество записанных байт (оно никогда не меньше318319`len(b)`320321, так как в случае неудачи записи будет возбуждено322323[`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)324325).326327## Сырой файловый ввод-вывод328329#### `[io.FileIO]class io.FileIO(name[, mode])`330331[`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) тоже).332333Параметр *mode* может быть равен `'r'`, `'w'` или `'a'` для чтения (по умолчанию), записи или дозаписи. Файл будет создан, если он не существует, при открытии на запись или дозапись; при открытии на запись файл будет усечён. Добавление `'+'` к режиму позволяет одновременно читать и писать.334335В дополнение к атрибутам и методам от [`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) предоставляет следующие атрибуты и методы:336337#### `[io.FileIO.mode]mode`338339Режим, указанный в конструкторе.340341#### `[io.FileIO.name]name`342343Имя файла. Это дескриптор файла, если имя не указано в конструкторе.344345#### `[io.FileIO.read]read([n])`346347Читает и возвращает не более348349*n*350351байт. Выполняется только один системный вызов, поэтому возможно, что возвращается меньше данных, чем запрошено. Используйте352353[`len()`](https://python-all.ru/3.0/library/functions.html#len)354355для возвращённого объекта bytes, чтобы узнать, сколько байт было получено. (В неблокирующем режиме356357`None`358359возвращается, когда нет доступных данных.)360361#### `[io.FileIO.readall]readall()`362363Читает и возвращает всё содержимое файла в виде одного объекта bytes. В неблокирующем режиме возвращается столько, сколько сразу доступно. Если достигнут EOF, возвращается364365`b''`366367.368369#### `[io.FileIO.write]write(b)`370371Записывает объект bytes или bytearray,372373*b*374375, в файл и возвращает количество реально записанных байт. Выполняется только один системный вызов, поэтому возможно, что записана только часть данных.376377Обратите внимание, что унаследованный метод `readinto()` не следует использовать для объектов [`FileIO`](https://python-all.ru/3.0/library/io.html#io.FileIO).378379## Буферизированные потоки380381#### `[io.BufferedIOBase]class io.BufferedIOBase`382383Базовый класс для потоков, поддерживающих буферизацию. Он наследует [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Открытого конструктора нет.384385Основное отличие от [`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).386387Кроме того, [`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`.388389Типичная реализация не должна наследовать от реализации [`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).390391[`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase) предоставляет или переопределяет следующие методы в дополнение к методам из [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase):392393#### `[io.BufferedIOBase.read]read([n])`394395Читает и возвращает не более *n* байтов. Если аргумент опущен, равен `None` или отрицателен, данные читаются и возвращаются до достижения EOF. Если поток уже находится в конце, возвращается пустой объект bytes.396397Если аргумент положителен, а базовый сырой поток не является интерактивным, может быть выполнено несколько сырых чтений, чтобы обеспечить требуемое количество байт (если только не достигнут EOF). Но для интерактивных сырых потоков будет выполнено не более одного сырого чтения, и короткий результат не означает, что EOF неизбежен.398399[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) возбуждается, если нижележащий сырой поток на данный момент не имеет данных.400401#### `[io.BufferedIOBase.readinto]readinto(b)`402403Читает до len(b) байтов в bytearray *b* и возвращает количество прочитанных байтов.404405Как и в случае с [`read()`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase.read), к нижележащему сырому потоку может быть выполнено несколько чтений, если только он не является «интерактивным».406407[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) возбуждается, если нижележащий сырой поток на данный момент не имеет данных.408409#### `[io.BufferedIOBase.write]write(b)`410411Записывает переданный объект bytes или bytearray, *b*, в нижележащий сырой поток и возвращает количество записанных байт (не меньше `len(b)`, так как при сбое записи будет возбуждено [`IOError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IOError)).412413[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError) возбуждается, если буфер заполнен, а нижележащий сырой поток в данный момент не может принять больше данных.414415#### `[io.BytesIO]class io.BytesIO([initial_bytes])`416417Реализация потока, использующая буфер байт в памяти. Наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).418419Аргумент *initial\_bytes* – необязательный исходный bytearray.420421[`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):422423#### `[io.BytesIO.getvalue]getvalue()`424425Возвращает объект426427`bytes`428429, содержащий всё содержимое буфера.430431#### `[io.BytesIO.read1]read1()`432433В434435[`BytesIO`](https://python-all.ru/3.0/library/io.html#io.BytesIO)436437это эквивалентно438439`read()`440441.442443#### `[io.BytesIO.truncate]truncate([size])`444445Усекает буфер до размера не более446447*size*448449байт.450451*size*452453по умолчанию равен текущей позиции в потоке, возвращаемой454455`tell()`456457.458459#### `[io.BufferedReader]class io.BufferedReader(raw[, buffer_size])`460461Буфер для читаемого последовательного объекта [`RawIOBase`](https://python-all.ru/3.0/library/io.html#io.RawIOBase). Он наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).462463Конструктор создаёт [`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).464465[`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):466467#### `[io.BufferedReader.peek]peek([n])`468469Возвращает 1 байт (или470471*n*472473, если указано) из буфера без продвижения позиции. Для удовлетворения вызова выполняется только одно чтение из сырого потока. Количество возвращённых байт может быть меньше запрошенного, так как возвращается не более всех байт буфера от текущей позиции до конца.474475#### `[io.BufferedReader.read]read([n])`476477Читает и возвращает478479*n*480481байт, или, если482483*n*484485не указан или отрицателен, до EOF или если вызов чтения заблокируется в неблокирующем режиме.486487#### `[io.BufferedReader.read1]read1(n)`488489Читает и возвращает до490491*n*492493байт, выполняя только один вызов небуферизованного потока. Если в буфере есть хотя бы один байт, возвращаются только буферизованные байты. В противном случае выполняется один вызов чтения небуферизованного потока.494495#### `[io.BufferedWriter]class io.BufferedWriter(raw[, buffer_size[, max_buffer_size]])`496497Буфер для записываемого последовательного объекта RawIO. Он наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).498499Конструктор создаёт [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter) для заданного записываемого потока *raw*. Если *buffer\_size* не указан, по умолчанию используется `DEAFULT_BUFFER_SIZE`. Если *max\_buffer\_size* опущен, по умолчанию он равен двум размерам буфера.500501[`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):502503#### `[io.BufferedWriter.flush]flush()`504505Принудительно сбрасывает байты, находящиеся в буфере, в необработанный поток. Если необработанный поток блокируется, должно быть возбуждено исключение506507[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError)508509.510511#### `[io.BufferedWriter.write]write(b)`512513Записывает объект bytes или bytearray,514515*b*516517, в сырой поток и возвращает количество записанных байт.518519[`BlockingIOError`](https://python-all.ru/3.0/library/io.html#io.BlockingIOError)520521возбуждается, когда сырой поток блокируется.522523#### `[io.BufferedRWPair]class io.BufferedRWPair(reader, writer[, buffer_size[, max_buffer_size]])`524525Объединённый буферизованный объект для записи и чтения для сырого потока, с которого можно читать и в который можно писать. Он поддерживает как `read()`, так и `write()`, и их варианты. Это полезно для сокетов и двусторонних каналов. Он наследует [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).526527*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* (для буферизованного писателя) по умолчанию равен двойному размеру буфера.528529[`BufferedRWPair`](https://python-all.ru/3.0/library/io.html#io.BufferedRWPair) реализует все методы [`BufferedIOBase`](https://python-all.ru/3.0/library/io.html#io.BufferedIOBase).530531#### `[io.BufferedRandom]class io.BufferedRandom(raw[, buffer_size[, max_buffer_size]])`532533Буферизированный интерфейс для потоков с произвольным доступом. Он наследует [`BufferedReader`](https://python-all.ru/3.0/library/io.html#io.BufferedReader) и [`BufferedWriter`](https://python-all.ru/3.0/library/io.html#io.BufferedWriter).534535Конструктор создаёт средство чтения и записи для потока raw с произвольным доступом, заданного в первом аргументе. Если *buffer\_size* опущен, по умолчанию используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.0/library/io.html#io.DEFAULT_BUFFER_SIZE). *max\_buffer\_size* (для буферизированного средства записи) по умолчанию равен удвоенному размеру буфера.536537[`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).538539## Текстовый ввод-вывод540541#### `[io.TextIOBase]class io.TextIOBase`542543Базовый класс для текстовых потоков. Этот класс предоставляет посимвольный и построчный интерфейс для потокового ввода-вывода. Метод `readinto()` отсутствует, поскольку строки Python неизменяемы. Он наследует [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase). Открытый конструктор отсутствует.544545[`TextIOBase`](https://python-all.ru/3.0/library/io.html#io.TextIOBase) предоставляет или переопределяет следующие атрибуты данных и методы в дополнение к унаследованным от [`IOBase`](https://python-all.ru/3.0/library/io.html#io.IOBase):546547#### `[io.TextIOBase.encoding]encoding`548549Имя кодировки, используемой для декодирования байтов потока в строки и для кодирования строк в байты.550551#### `[io.TextIOBase.newlines]newlines`552553Строка, кортеж строк или554555`None`556557, указывающий на переведённые к настоящему моменту символы новой строки.558559#### `[io.TextIOBase.read]read(n)`560561Читает не более562563*n*564565символов из потока и возвращает их в виде одной строки566567[`str`](https://python-all.ru/3.0/library/functions.html#str)568569. Если570571*n*572573отрицательно или574575`None`576577, чтение выполняется до конца файла.578579#### `[io.TextIOBase.readline]readline()`580581Читает до символа новой строки или конца файла и возвращает одну строку582583`str`584585. Если поток уже достиг конца файла, возвращается пустая строка.586587#### `[io.TextIOBase.write]write(s)`588589Записывает строку590591*s*592593в поток и возвращает количество записанных символов.594595#### `[io.TextIOWrapper]class io.TextIOWrapper(buffer[, encoding[, errors[, newline[, line_buffering]]]])`596597Буферизированный текстовый поток поверх 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).598599*encoding* задаёт имя кодировки, в которую будет декодироваться или кодироваться поток. По умолчанию используется [`locale.getpreferredencoding()`](https://python-all.ru/3.0/library/locale.html#locale.getpreferredencoding).600601*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).602603*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*.604605Если *line\_buffering* равно `True`, `flush()` подразумевается при вызове write, содержащем символ новой строки.606607[`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper) предоставляет следующие атрибуты данных в дополнение к атрибутам [`TextIOBase`](https://python-all.ru/3.0/library/io.html#io.TextIOBase) и его родительских классов:608609#### `[io.TextIOWrapper.errors]errors`610611Настройка обработки ошибок кодирования и декодирования.612613#### `[io.TextIOWrapper.line_buffering]line_buffering`614615Определяет, включена ли построчная буферизация.616617#### `[io.StringIO]class io.StringIO([initial_value[, encoding[, errors[, newline]]]])`618619Поток в памяти для текста. Он наследует [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper).620621Создаёт новый поток StringIO с начальным значением, кодировкой, обработкой ошибок и настройкой символов новой строки. Подробнее см. конструктор [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper).622623[`StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO) предоставляет следующий метод в дополнение к методам [`TextIOWrapper`](https://python-all.ru/3.0/library/io.html#io.TextIOWrapper) и его родительских классов:624625#### `[io.StringIO.getvalue]getvalue()`626627Возвращает628629`str`630631, содержащую полное содержимое буфера в любой момент до вызова метода632633`close()`634635объекта636637[`StringIO`](https://python-all.ru/3.0/library/io.html#io.StringIO)638639.640641Пример использования:642643```python644import io645646output = io.StringIO()647output.write('First line.\n')648print('Second line.', file=output)649650# Извлечь содержимое файла – это будет651# 'Первая строка.652Вторая строка.653'654contents = output.getvalue()655656# Закрыть объект и освободить буфер памяти –657# .getvalue() теперь будет вызывать исключение.658output.close()659```660661#### `[io.IncrementalNewlineDecoder]class io.IncrementalNewlineDecoder`662663Вспомогательный кодек, декодирующий концы строк для универсального режима концов строк. Он наследует664665[`codecs.IncrementalDecoder`](https://python-all.ru/3.0/library/codecs.html#codecs.IncrementalDecoder)666667.668