io.md
1> **Источник:** https://python-all.ru/3.7/library/io.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`io`](https://python-all.ru/3.7/library/io.html#module-io) – основные инструменты для работы с потоками данных89**Исходный код:** [Lib/io.py](https://python-all.ru/src/3.7/Lib/io.py)1011---1213## Обзор1415Модуль [`io`](https://python-all.ru/3.7/library/io.html#module-io) предоставляет основные средства Python для работы с различными типами ввода-вывода. Существует три основных типа ввода-вывода: *текстовый ввод-вывод*, *двоичный ввод-вывод* и *необработанный ввод-вывод*. Это общие категории, и для каждой из них могут использоваться различные хранилища. Конкретный объект, относящийся к любой из этих категорий, называется [файловым объектом](https://python-all.ru/3.7/glossary.html#term-file-object). Другие распространённые термины – *поток данных* и *объект, подобный файлу*.1617Независимо от категории, каждый конкретный потоковый объект также обладает различными возможностями: он может быть только для чтения, только для записи или для чтения и записи. Он может также допускать произвольный доступ (перемещение вперёд или назад к любому месту) или только последовательный доступ (например, в случае сокета или канала).1819Все потоки данных строго следят за типом передаваемых им данных. Например, передача объекта [`str`](https://python-all.ru/3.7/library/stdtypes.html#str) методу `write()` двоичного потока вызовет [`TypeError`](https://python-all.ru/3.7/library/exceptions.html#TypeError). То же самое произойдёт при передаче объекта [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes) методу `write()` текстового потока.2021Изменено в версии 3.3: Операции, которые раньше вызывали [`IOError`](https://python-all.ru/3.7/library/exceptions.html#IOError), теперь вызывают [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError), поскольку [`IOError`](https://python-all.ru/3.7/library/exceptions.html#IOError) теперь является псевдонимом [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError).2223### Текстовый ввод-вывод2425Текстовый ввод-вывод ожидает и возвращает объекты [`str`](https://python-all.ru/3.7/library/stdtypes.html#str). Это означает, что всякий раз, когда хранилище изначально состоит из байтов (например, в случае файла), кодирование и декодирование данных выполняется прозрачно, а также выполняется необязательное преобразование символов новой строки, специфичных для платформы.2627Самый простой способ создать текстовый поток – использовать [`open()`](https://python-all.ru/3.7/library/functions.html#open), при необходимости указав кодировку:2829```python30f = open("myfile.txt", "r", encoding="utf-8")31```3233Текстовые потоки в памяти также доступны в виде объектов [`StringIO`](https://python-all.ru/3.7/library/io.html#io.StringIO):3435```python36f = io.StringIO("some initial text data")37```3839API текстовых потоков подробно описан в документации [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase).4041### Двоичный ввод-вывод4243Двоичный ввод-вывод (также называемый *буферизованным вводом-выводом*) ожидает [байтоподобные объекты](https://python-all.ru/3.7/glossary.html#term-bytes-like-object) и возвращает объекты [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes). Кодирование, декодирование или преобразование символов новой строки не выполняется. Эта категория потоков может использоваться для всех видов нетекстовых данных, а также когда требуется ручной контроль над обработкой текстовых данных.4445Самый простой способ создать двоичный поток – использовать [`open()`](https://python-all.ru/3.7/library/functions.html#open) с `'b'` в строке режима:4647```python48f = open("myfile.jpg", "rb")49```5051Двоичные потоки в памяти также доступны в виде объектов [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO):5253```python54f = io.BytesIO(b"some initial binary data: \x00\x01")55```5657API двоичных потоков подробно описан в документации [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase).5859Другие библиотечные модули могут предоставлять дополнительные способы создания текстовых или двоичных потоков. См., например, [`socket.socket.makefile()`](https://python-all.ru/3.7/library/socket.html#socket.socket.makefile).6061### Необработанный ввод-вывод6263Необработанный ввод-вывод (также называемый *небуферизованным вводом-выводом*) обычно используется как низкоуровневый строительный блок для двоичных и текстовых потоков; редко бывает полезно напрямую манипулировать необработанным потоком из пользовательского кода. Тем не менее, можно создать необработанный поток, открыв файл в двоичном режиме с отключённой буферизацией:6465```python66f = open("myfile.jpg", "rb", buffering=0)67```6869API необработанных потоков подробно описан в документации [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase).7071## Интерфейс модуля высокого уровня7273#### `io.DEFAULT_BUFFER_SIZE`7475Целое число, содержащее размер буфера по умолчанию, используемый классами буферизованного ввода-вывода модуля. [`open()`](https://python-all.ru/3.7/library/functions.html#open) использует blksize файла (получаемый с помощью [`os.stat()`](https://python-all.ru/3.7/library/os.html#os.stat)), если это возможно.7677#### `io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)`7879Это псевдоним для встроенной функции [`open()`](https://python-all.ru/3.7/library/functions.html#open).8081#### `exception io.BlockingIOError`8283Это псевдоним для встроенного исключения [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError).8485#### `exception io.UnsupportedOperation`8687Исключение, наследующее [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError) и [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError), которое вызывается, когда неподдерживаемая операция вызывается для потока.8889### Потоки в памяти9091Также можно использовать [`str`](https://python-all.ru/3.7/library/stdtypes.html#str) или [байтоподобный объект](https://python-all.ru/3.7/glossary.html#term-bytes-like-object) в качестве файла для чтения и записи. Для строк [`StringIO`](https://python-all.ru/3.7/library/io.html#io.StringIO) может использоваться как файл, открытый в текстовом режиме. [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO) может использоваться как файл, открытый в двоичном режиме. Оба обеспечивают полные возможности чтения и записи с произвольным доступом.9293> **См. также**94>95> **[`sys`](https://python-all.ru/3.7/library/sys.html#module-sys)**96>97> содержит стандартные потоки ввода-вывода: [`sys.stdin`](https://python-all.ru/3.7/library/sys.html#sys.stdin), [`sys.stdout`](https://python-all.ru/3.7/library/sys.html#sys.stdout), и [`sys.stderr`](https://python-all.ru/3.7/library/sys.html#sys.stderr).9899## Иерархия классов100101Реализация потоков ввода-вывода организована в виде иерархии классов. Сначала [абстрактные базовые классы](https://python-all.ru/3.7/glossary.html#term-abstract-base-class) (ABC), которые используются для определения различных категорий потоков, затем конкретные классы, предоставляющие стандартные реализации потоков.102103> > **Примечание**104> >105> > Абстрактные базовые классы также предоставляют реализации по умолчанию некоторых методов, чтобы помочь реализации конкретных классов потоков. Например, [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) предоставляет неоптимизированные реализации `readinto()` и [`readline()`](https://python-all.ru/3.7/library/io.html#io.IOBase.readline).106107На вершине иерархии ввода-вывода находится абстрактный базовый класс [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase). Он определяет базовый интерфейс потока. Однако обратите внимание, что нет разделения между чтением и записью в потоки; реализации могут вызывать [`UnsupportedOperation`](https://python-all.ru/3.7/library/io.html#io.UnsupportedOperation), если они не поддерживают данную операцию.108109ABC [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) расширяет [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase). Он занимается чтением и записью байтов в поток. [`FileIO`](https://python-all.ru/3.7/library/io.html#io.FileIO) является подклассом [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase), чтобы предоставить интерфейс к файлам в файловой системе машины.110111ABC [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) занимается буферизацией необработанного потока байтов ([`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase)). Его подклассы [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter), [`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader) и [`BufferedRWPair`](https://python-all.ru/3.7/library/io.html#io.BufferedRWPair) буферизуют потоки данных, которые являются читаемыми, записываемыми, а также одновременно читаемыми и записываемыми. [`BufferedRandom`](https://python-all.ru/3.7/library/io.html#io.BufferedRandom) предоставляет буферизованный интерфейс для потоков с произвольным доступом. Другой подкласс [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase), [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO), представляет собой поток байтов в памяти.112113ABC [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase), ещё один подкласс [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase), работает с потоками, байты которых представляют текст, и отвечает за кодирование и декодирование в строки и из строк. [`TextIOWrapper`](https://python-all.ru/3.7/library/io.html#io.TextIOWrapper), который расширяет его, представляет собой буферизованный текстовый интерфейс к буферизованному необработанному потоку ([`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase)). Наконец, [`StringIO`](https://python-all.ru/3.7/library/io.html#io.StringIO) – это поток в памяти для текста.114115Имена аргументов не являются частью спецификации, и только аргументы [`open()`](https://python-all.ru/3.7/library/functions.html#open) предназначены для использования в качестве именованных аргументов.116117В следующей таблице приведены абстрактные базовые классы, предоставляемые модулем [`io`](https://python-all.ru/3.7/library/io.html#module-io):118119| ABC | Наследует | Методы-заглушки | Методы-примеси и свойства |120| --- | --- | --- | --- |121| [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) | | `fileno`, `seek` и `truncate` | `close`, `closed`, `__enter__`, `__exit__`, `flush`, `isatty`, `__iter__`, `__next__`, `readable`, `readline`, `readlines`, `seekable`, `tell`, `writable` и `writelines` |122| [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) | [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) | `readinto` и `write` | Наследуемые методы [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase), `read`, и `readall` |123| [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) | [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) | `detach`, `read`, `read1`, и `write` | Наследуемые методы [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase), `readinto`, и `readinto1` |124| [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase) | [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) | `detach`, `read`, `readline`, и `write` | Наследуемые методы [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase), `encoding`, `errors`, и `newlines` |125126### Базовые классы ввода-вывода127128#### `class io.IOBase`129130Абстрактный базовый класс для всех классов ввода-вывода, работающий с потоками байтов. Отсутствует открытый конструктор.131132Этот класс предоставляет пустые абстрактные реализации для многих методов, которые производные классы могут выборочно переопределять; реализации по умолчанию представляют файл, который нельзя читать, записывать или позиционировать.133134Хотя [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) не объявляет `read()` или `write()`, поскольку их сигнатуры различаются, реализации и клиенты должны считать эти методы частью интерфейса. Кроме того, реализации могут возбуждать [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) (или [`UnsupportedOperation`](https://python-all.ru/3.7/library/io.html#io.UnsupportedOperation)), когда вызываются неподдерживаемые ими операции.135136Базовый тип, используемый для двоичных данных, читаемых из файла или записываемых в файл, – это [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes). Другие [байтоподобные объекты](https://python-all.ru/3.7/glossary.html#term-bytes-like-object) также принимаются в качестве аргументов методов. Классы текстового ввода-вывода работают с данными [`str`](https://python-all.ru/3.7/library/stdtypes.html#str).137138Обратите внимание, что вызов любого метода (даже запросов) для закрытого потока является неопределённым. В этом случае реализации могут возбудить [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError).139140[`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) (и его подклассы) поддерживает протокол итератора, то есть объект [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) можно перебирать, получая строки из потока. Строки определяются немного по-разному в зависимости от того, является ли поток двоичным (возвращает байты) или текстовым (возвращает строки символов). См. [`readline()`](https://python-all.ru/3.7/library/io.html#io.IOBase.readline) ниже.141142[`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) также является контекстным менеджером и поэтому поддерживает инструкцию [`with`](https://python-all.ru/3.7/reference/compound_stmts.html#with). В этом примере *file* закрывается после завершения блока инструкции `with` – даже если возникло исключение:143144```python145with open('spam.txt', 'w') as file:146 file.write('Spam and eggs!')147```148149[`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) предоставляет следующие атрибуты данных и методы:150151#### `close()`152153Сбрасывает буферы и закрывает этот поток. Этот метод не оказывает эффекта, если файл уже закрыт. После закрытия файла любая операция с файлом (например, чтение или запись) возбудит [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError).154155Для удобства допускается вызывать этот метод несколько раз; однако эффект будет иметь только первый вызов.156157#### `closed`158159`True`, если поток закрыт.160161#### `fileno()`162163Возвращает базовый файловый дескриптор (целое число) потока, если он существует. Если объект ввода-вывода не использует файловый дескриптор, возбуждается [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError).164165#### `flush()`166167Сбрасывает буферы записи потока, если это применимо. Для потоков только для чтения и неблокирующих потоков эта операция ничего не делает.168169#### `isatty()`170171Возвращает `True`, если поток данных является интерактивным (т.е. подключён к терминальному/tty-устройству).172173#### `readable()`174175Возвращает `True`, если из потока можно читать. Если `False`, `read()` вызовет [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError).176177#### `readline(size=-1)`178179Читает и возвращает одну строку из потока. Если указан *size*, будет прочитано не более *size* байт.180181Окончанием строки для бинарных файлов всегда является `b'\n'`; для текстовых файлов аргумент *newline* функции [`open()`](https://python-all.ru/3.7/library/functions.html#open) позволяет выбрать распознаваемые окончания строк.182183#### `readlines(hint=-1)`184185Читает и возвращает список строк из потока. Можно указать *hint* для ограничения количества читаемых строк: чтение прекратится, когда общий размер (в байтах/символах) всех прочитанных строк превысит *hint*.186187Обратите внимание, что по файловым объектам уже можно итерироваться с помощью `for line in file: ...` без вызова `file.readlines()`.188189#### `seek(offset, whence=SEEK_SET)`190191Устанавливает позицию в потоке на заданное байтовое *offset*. *offset* интерпретируется относительно позиции, указанной в *whence*. Значение по умолчанию для *whence* – `SEEK_SET`. Допустимые значения для *whence*:192193- `SEEK_SET` или `0` – начало потока (по умолчанию); *offset* должно быть нулевым или положительным194- `SEEK_CUR` или `1` – текущая позиция в потоке; *offset* может быть отрицательным195- `SEEK_END` или `2` – конец потока; *offset* обычно отрицательный196197Возвращает новую абсолютную позицию.198199Новое в версии 3.1: Константы `SEEK_*`.200201Новое в версии 3.3: Некоторые операционные системы могут поддерживать дополнительные значения, например `os.SEEK_HOLE` или `os.SEEK_DATA`. Допустимые значения для файла могут зависеть от того, открыт ли он в текстовом или двоичном режиме.202203#### `seekable()`204205Возвращает `True`, если поток поддерживает произвольный доступ. Если `False`, [`seek()`](https://python-all.ru/3.7/library/io.html#io.IOBase.seek), [`tell()`](https://python-all.ru/3.7/library/io.html#io.IOBase.tell) и [`truncate()`](https://python-all.ru/3.7/library/io.html#io.IOBase.truncate) вызовут исключение [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError).206207#### `tell()`208209Возвращает текущую позицию в потоке.210211#### `truncate(size=None)`212213Изменяет размер потока до указанного *size* в байтах (или до текущей позиции, если *size* не указан). Текущая позиция в потоке не меняется. Такое изменение может увеличить или уменьшить текущий размер файла. При увеличении содержимое новой области файла зависит от платформы (в большинстве систем дополнительные байты заполняются нулями). Возвращается новый размер файла.214215Изменено в версии 3.5: В Windows при расширении файлы теперь заполняются нулями.216217#### `writable()`218219Возвращает `True`, если поток поддерживает запись. Если `False`, `write()` и [`truncate()`](https://python-all.ru/3.7/library/io.html#io.IOBase.truncate) вызовут исключение [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError).220221#### `writelines(lines)`222223Записывает список строк в поток. Разделители строк не добавляются, поэтому обычно каждая переданная строка уже содержит разделитель в конце.224225#### `__del__()`226227Подготавливает объект к уничтожению. [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) предоставляет реализацию этого метода по умолчанию, которая вызывает метод [`close()`](https://python-all.ru/3.7/library/io.html#io.IOBase.close) экземпляра.228229#### `class io.RawIOBase`230231Базовый класс для необработанного двоичного ввода-вывода. Он наследует [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase). Отсутствует открытый конструктор.232233Необработанный двоичный ввод-вывод обычно предоставляет низкоуровневый доступ к базовому устройству или API операционной системы и не пытается инкапсулировать его в высокоуровневые примитивы (это оставлено буферизованному и текстовому вводу-выводу, описанным далее на этой странице).234235В дополнение к атрибутам и методам из [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase), [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) предоставляет следующие методы:236237#### `read(size=-1)`238239Читает из объекта до *size* байт и возвращает их. Для удобства, если *size* не указан или равен -1, возвращаются все байты до конца файла. В противном случае выполняется только один системный вызов. Может быть возвращено меньше *size* байт, если системный вызов вернул меньше *size* байт.240241Если возвращается 0 байт, и *size* не было 0, это означает конец файла. Если объект находится в неблокирующем режиме и байты недоступны, возвращается `None`.242243Реализация по умолчанию делегирует [`readall()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.readall) и [`readinto()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.readinto).244245#### `readall()`246247Читает и возвращает все байты из потока до EOF, при необходимости выполняя несколько вызовов к потоку.248249#### `readinto(b)`250251Читает байты в предварительно выделенный, доступный для записи [объект, подобный байтам](https://python-all.ru/3.7/glossary.html#term-bytes-like-object) *b*, и возвращает количество прочитанных байт. Например, *b* может быть [`bytearray`](https://python-all.ru/3.7/library/stdtypes.html#bytearray). Если объект находится в неблокирующем режиме и байты недоступны, возвращается `None`.252253#### `write(b)`254255Записывает заданный [bytes-like object](https://python-all.ru/3.7/glossary.html#term-bytes-like-object), *b*, в базовый сырой поток и возвращает количество записанных байт. Это количество может быть меньше длины *b* в байтах в зависимости от особенностей базового сырого потока, особенно если он находится в неблокирующем режиме. `None` возвращается, если сырой поток настроен не блокироваться и ни один байт не может быть сразу записан. Вызывающий код может освободить или изменить *b* после возврата этого метода, поэтому реализация должна обращаться к *b* только во время вызова метода.256257#### `class io.BufferedIOBase`258259Базовый класс для двоичных потоков, поддерживающих тот или иной вид буферизации. Он наследует [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase). Отсутствует открытый конструктор.260261Основное отличие от [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) заключается в том, что методы [`read()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.read), [`readinto()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.readinto) и [`write()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.write) будут пытаться (соответственно) прочитать столько входных данных, сколько запрошено, или потребить все переданные выходные данные, ценой, возможно, более одного системного вызова.262263Кроме того, эти методы могут вызывать [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError), если базовый небуферизованный поток находится в неблокирующем режиме и не может принять или отдать достаточно данных; в отличие от своих аналогов из [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase), они никогда не вернут `None`.264265Кроме того, метод [`read()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.read) не имеет реализации по умолчанию, которая делегирует [`readinto()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.readinto).266267Типичная реализация [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) не должна наследовать от реализации [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase), а должна оборачивать её, как это делают [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter) и [`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader).268269[`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) предоставляет или переопределяет следующие методы и атрибут в дополнение к тем, что есть в [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase):270271#### `raw`272273Базовый сырой поток (экземпляр [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase)), с которым работает [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase). Это не является частью API [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) и может отсутствовать в некоторых реализациях.274275#### `detach()`276277Отделяет базовый сырой поток от буфера и возвращает его.278279После отсоединения сырого потока буфер переходит в нерабочее состояние.280281Некоторые буферы, такие как [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO), не имеют концепции одного сырого потока для возврата из этого метода. Они вызывают [`UnsupportedOperation`](https://python-all.ru/3.7/library/io.html#io.UnsupportedOperation).282283Новое в версии 3.1.284285#### `read(size=-1)`286287Читает и возвращает до *size* байт. Если аргумент опущен, равен `None` или отрицателен, данные читаются и возвращаются до достижения EOF. Если поток уже в конце файла, возвращается пустой объект [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes).288289Если аргумент положителен, а базовый сырой поток не является интерактивным, может быть выполнено несколько сырых чтений, чтобы обеспечить требуемое количество байт (если только не достигнут EOF). Но для интерактивных сырых потоков будет выполнено не более одного сырого чтения, и короткий результат не означает, что EOF неизбежен.290291Исключение [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError) возбуждается, если базовый сырой поток находится в неблокирующем режиме и в данный момент не содержит данных.292293#### `read1([size])`294295Читает и возвращает до *size* байт, выполняя не более одного вызова метода [`read()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.read) (или [`readinto()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.readinto)) базового сырого потока. Это может быть полезно при реализации собственной буферизации поверх объекта [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase).296297Если *size* равен `-1` (значение по умолчанию), возвращается произвольное количество байт (больше нуля, если только не достигнут EOF).298299#### `readinto(b)`300301Читает байты в предварительно выделенный, доступный для записи [байтоподобный объект](https://python-all.ru/3.7/glossary.html#term-bytes-like-object) *b* и возвращает количество прочитанных байт. Например, *b* может быть [`bytearray`](https://python-all.ru/3.7/library/stdtypes.html#bytearray).302303Как и [`read()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.read), может быть выполнено несколько чтений из нижележащего сырого потока, если только последний не является интерактивным.304305Исключение [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError) возбуждается, если нижележащий сырой поток находится в неблокирующем режиме и в данный момент не имеет доступных данных.306307#### `readinto1(b)`308309Читает байты в предварительно выделенный, доступный для записи [байтоподобный объект](https://python-all.ru/3.7/glossary.html#term-bytes-like-object) *b*, используя не более одного вызова метода [`read()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.read) (или [`readinto()`](https://python-all.ru/3.7/library/io.html#io.RawIOBase.readinto)) нижележащего сырого потока. Возвращает количество прочитанных байт.310311Исключение [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError) возбуждается, если нижележащий сырой поток находится в неблокирующем режиме и в данный момент не имеет доступных данных.312313Новое в версии 3.5.314315#### `write(b)`316317Записывает данный [байтоподобный объект](https://python-all.ru/3.7/glossary.html#term-bytes-like-object), *b*, и возвращает количество записанных байт (всегда равное длине *b* в байтах, поскольку если запись завершается неудачей, возбуждается [`OSError`](https://python-all.ru/3.7/library/exceptions.html#OSError)). В зависимости от реализации, эти байты могут быть сразу записаны в нижележащий поток или сохранены в буфере по соображениям производительности и задержки.318319В неблокирующем режиме возбуждается [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError), если данные необходимо записать в сырой поток, но он не может принять все данные без блокировки.320321Вызывающий код может освободить или изменить *b* после возврата из этого метода, поэтому реализация должна обращаться к *b* только во время вызова метода.322323### Сырой файловый ввод-вывод324325#### `class io.FileIO(name, mode='r', closefd=True, opener=None)`326327[`FileIO`](https://python-all.ru/3.7/library/io.html#io.FileIO) представляет собой файл на уровне операционной системы, содержащий данные в байтах. Он реализует интерфейс [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) (а следовательно, и интерфейс [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase)).328329Параметр *name* может быть одним из двух:330331- строкой или объектом [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes), представляющим путь к файлу, который будет открыт. В этом случае closefd должен быть `True` (по умолчанию), иначе будет возбуждена ошибка.332- целым числом, представляющим номер существующего файлового дескриптора уровня ОС, к которому результирующий объект [`FileIO`](https://python-all.ru/3.7/library/io.html#io.FileIO) предоставит доступ. Когда объект FileIO будет закрыт, этот fd также будет закрыт, если только *closefd* не установлен в `False`.333334Параметр *mode* может быть `'r'`, `'w'`, `'x'` или `'a'` для чтения (по умолчанию), записи, исключительного создания или добавления. Файл будет создан, если он не существует при открытии для записи или добавления; он будет усечён при открытии для записи. [`FileExistsError`](https://python-all.ru/3.7/library/exceptions.html#FileExistsError) будет возбуждено, если он уже существует при открытии для создания. Открытие файла для создания подразумевает запись, поэтому этот режим ведёт себя аналогично `'w'`. Добавьте `'+'` к режиму, чтобы разрешить одновременное чтение и запись.335336Методы `read()` (при вызове с положительным аргументом), `readinto()` и `write()` этого класса будут выполнять только один системный вызов.337338Можно использовать пользовательский открыватель, передав вызываемый объект как *opener*. Нижележащий файловый дескриптор для объекта файла затем получается вызовом *opener* с (*name*, *flags*). *opener* должен вернуть открытый файловый дескриптор (передача [`os.open`](https://python-all.ru/3.7/library/os.html#os.open) в качестве *opener* приводит к функциональности, аналогичной передаче `None`).339340Созданный файл является [ненаследуемым](https://python-all.ru/3.7/library/os.html#fd-inheritance).341342Смотрите встроенную функцию [`open()`](https://python-all.ru/3.7/library/functions.html#open) для примеров использования параметра *opener*.343344Изменено в версии 3.3: Добавлен параметр *opener*. Добавлен режим `'x'`.345346Изменено в версии 3.4: Файл теперь не наследуется.347348В дополнение к атрибутам и методам из [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase) и [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase), [`FileIO`](https://python-all.ru/3.7/library/io.html#io.FileIO) предоставляет следующие атрибуты данных:349350#### `mode`351352Режим, указанный в конструкторе.353354#### `name`355356Имя файла. Это дескриптор файла, если имя не указано в конструкторе.357358### Буферизированные потоки359360Буферизированные потоки ввода-вывода предоставляют интерфейс более высокого уровня к устройству ввода-вывода, чем небуферизированный.361362#### `class io.BytesIO([initial_bytes])`363364Реализация потока, использующего буфер байтов в памяти. Он наследует [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase). Буфер отбрасывается при вызове метода [`close()`](https://python-all.ru/3.7/library/io.html#io.IOBase.close).365366Необязательный аргумент *initial\_bytes* – это [байтоподобный объект](https://python-all.ru/3.7/glossary.html#term-bytes-like-object), содержащий начальные данные.367368[`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO) предоставляет или переопределяет эти методы в дополнение к методам из [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) и [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase):369370#### `getbuffer()`371372Возвращает доступное для чтения и записи представление содержимого буфера без его копирования. Изменение этого представления также прозрачно обновляет содержимое буфера:373374```python375>>> b = io.BytesIO(b"abcdef")376>>> view = b.getbuffer()377>>> view[2:4] = b"56"378>>> b.getvalue()379b'ab56ef'380```381382> **Примечание**383>384> Пока существует представление, объект [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO) нельзя изменить в размере или закрыть.385386Новое в версии 3.2.387388#### `getvalue()`389390Возвращает [`bytes`](https://python-all.ru/3.7/library/stdtypes.html#bytes), содержащий всё содержимое буфера.391392#### `read1([size])`393394В [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO) это то же самое, что и [`read()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.read).395396Изменено в версии 3.7: Аргумент *size* теперь необязателен.397398#### `readinto1(b)`399400В [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO) это то же самое, что и [`readinto()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.readinto).401402Новое в версии 3.5.403404#### `class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE)`405406Буфер, предоставляющий доступ более высокого уровня к читаемому последовательному объекту [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase). Он наследует [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase). При чтении данных из этого объекта может быть запрошен больший объём данных из нижележащего необработанного потока, который сохраняется во внутреннем буфере. Затем буферизованные данные могут быть возвращены непосредственно при последующих чтениях.407408Конструктор создаёт [`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader) для заданного читаемого потока *raw* и *buffer\_size*. Если *buffer\_size* не указан, используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.7/library/io.html#io.DEFAULT_BUFFER_SIZE).409410[`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader) предоставляет или переопределяет следующие методы в дополнение к методам из [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) и [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase):411412#### `peek([size])`413414Возвращает байты из потока без продвижения позиции. Для выполнения вызова производится не более одного чтения из сырого потока. Количество возвращённых байт может быть меньше или больше запрошенного.415416#### `read([size])`417418Читает и возвращает *size* байт, или, если *size* не задан или отрицателен, до достижения EOF или пока вызов чтения не заблокируется в неблокирующем режиме.419420#### `read1([size])`421422Читает и возвращает до *size* байт, выполняя только один вызов к сырому потоку. Если хотя бы один байт уже находится в буфере, возвращаются только буферизованные байты. В противном случае выполняется один вызов чтения сырого потока.423424Изменено в версии 3.7: Аргумент *size* теперь необязателен.425426#### `class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE)`427428Буфер, предоставляющий доступ более высокого уровня к последовательному [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) объекту, поддерживающему запись. Он наследует [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase). При записи в этот объект данные обычно помещаются во внутренний буфер. Буфер выгружается в нижележащий [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) объект при различных условиях, включая:429430- когда буфер становится слишком мал для всех ожидающих данных;431- когда вызывается [`flush()`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter.flush);432- когда запрашивается `seek()` (для объектов [`BufferedRandom`](https://python-all.ru/3.7/library/io.html#io.BufferedRandom));433- когда объект [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter) закрывается или уничтожается.434435Конструктор создает [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter) для заданного записываемого *сырого* потока. Если *buffer\_size* не указан, по умолчанию используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.7/library/io.html#io.DEFAULT_BUFFER_SIZE).436437[`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter) предоставляет или переопределяет следующие методы в дополнение к методам из [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) и [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase):438439#### `flush()`440441Принудительно передает байты, находящиеся в буфере, в сырой поток. Если сырой поток блокируется, должно быть возбуждено исключение [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError).442443#### `write(b)`444445Записывает [байтоподобный объект](https://python-all.ru/3.7/glossary.html#term-bytes-like-object), *b*, и возвращает количество записанных байт. В неблокирующем режиме возбуждается [`BlockingIOError`](https://python-all.ru/3.7/library/exceptions.html#BlockingIOError), если необходимо сбросить буфер, но сырой поток блокируется.446447#### `class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE)`448449Буферизированный интерфейс для потоков с произвольным доступом. Он наследует [`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader) и [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter), а также поддерживает функционал `seek()` и `tell()`.450451Конструктор создает читатель и писатель для сырого потока с произвольным доступом, заданного в первом аргументе. Если *buffer\_size* опущен, по умолчанию используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.7/library/io.html#io.DEFAULT_BUFFER_SIZE).452453[`BufferedRandom`](https://python-all.ru/3.7/library/io.html#io.BufferedRandom) способен на всё то же, что [`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader) или [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter).454455#### `class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE)`456457Буферизованный объект ввода-вывода, объединяющий два однонаправленных [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase) объекта (один для чтения, другой для записи) в единую двунаправленную конечную точку. Наследует [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase).458459*reader* и *writer* – это объекты [`RawIOBase`](https://python-all.ru/3.7/library/io.html#io.RawIOBase), которые являются читаемыми и записываемыми соответственно. Если *buffer\_size* опущен, по умолчанию используется [`DEFAULT_BUFFER_SIZE`](https://python-all.ru/3.7/library/io.html#io.DEFAULT_BUFFER_SIZE).460461[`BufferedRWPair`](https://python-all.ru/3.7/library/io.html#io.BufferedRWPair) реализует все методы [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase), кроме [`detach()`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase.detach), который вызывает [`UnsupportedOperation`](https://python-all.ru/3.7/library/io.html#io.UnsupportedOperation).462463> **Предупреждение**464>465> [`BufferedRWPair`](https://python-all.ru/3.7/library/io.html#io.BufferedRWPair) не пытается синхронизировать доступ к своим базовым сырым потокам. Не следует передавать ему один и тот же объект в качестве читателя и писателя; вместо этого используйте [`BufferedRandom`](https://python-all.ru/3.7/library/io.html#io.BufferedRandom).466467### Текстовый ввод-вывод468469#### `class io.TextIOBase`470471Базовый класс для текстовых потоков. Предоставляет символьный и построчный интерфейс для потокового ввода-вывода. Наследует [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase). Открытого конструктора нет.472473[`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase) предоставляет или переопределяет следующие атрибуты данных и методы в дополнение к атрибутам и методам из [`IOBase`](https://python-all.ru/3.7/library/io.html#io.IOBase):474475#### `encoding`476477Имя кодировки, используемой для декодирования байтов потока в строки и для кодирования строк в байты.478479#### `errors`480481Настройка обработки ошибок декодера или кодера.482483#### `newlines`484485Строка, кортеж строк или `None`, указывающие, какие символы новой строки были преобразованы на данный момент. В зависимости от реализации и исходных флагов конструктора это может быть недоступно.486487#### `buffer`488489Базовый двоичный буфер (экземпляр [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase)), с которым работает [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase). Это не часть [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase) API и может отсутствовать в некоторых реализациях.490491#### `detach()`492493Отделяет базовый двоичный буфер от [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase) и возвращает его.494495После отсоединения базового буфера [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase) непригоден для использования.496497Некоторые реализации [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase), например [`StringIO`](https://python-all.ru/3.7/library/io.html#io.StringIO), могут не иметь понятия базового буфера, и вызов этого метода вызовет [`UnsupportedOperation`](https://python-all.ru/3.7/library/io.html#io.UnsupportedOperation).498499Новое в версии 3.1.500501#### `read(size=-1)`502503Читает не более *size* символов из потока и возвращает их в виде [`str`](https://python-all.ru/3.7/library/stdtypes.html#str). Если *size* отрицательно или `None`, читает до конца файла.504505#### `readline(size=-1)`506507Читает до символа новой строки или конца файла и возвращает одну `str`. Если поток уже находится в конце файла, возвращается пустая строка.508509Если указан *size*, будет прочитано не более *size* символов.510511#### `seek(offset, whence=SEEK_SET)`512513Изменяет позицию в потоке на заданное значение *offset*. Поведение зависит от параметра *whence*. Значением по умолчанию для *whence* является `SEEK_SET`.514515- `SEEK_SET` или `0`: поиск от начала потока (по умолчанию); *offset* должен быть либо числом, возвращённым [`TextIOBase.tell()`](https://python-all.ru/3.7/library/io.html#io.TextIOBase.tell), либо нулём. Любое другое значение *offset* приводит к неопределённому поведению.516- `SEEK_CUR` или `1`: «поиск» в текущую позицию; *offset* должен быть нулём, что является пустой операцией (все остальные значения не поддерживаются).517- `SEEK_END` или `2`: поиск в конец потока; *offset* должен быть нулём (все остальные значения не поддерживаются).518519Возвращает новую абсолютную позицию в виде непрозрачного числа.520521Новое в версии 3.1: Константы `SEEK_*`.522523#### `tell()`524525Возвращает текущую позицию в потоке в виде непрозрачного числа. Обычно это число не соответствует количеству байт в базовом двоичном хранилище.526527#### `write(s)`528529Записывает строку *s* в поток и возвращает количество записанных символов.530531#### `class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False)`532533Буферизованный текстовый поток поверх [`BufferedIOBase`](https://python-all.ru/3.7/library/io.html#io.BufferedIOBase) двоичного потока. Наследует [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase).534535*Параметр encoding* указывает имя кодировки, в которую или из которой будет декодироваться или кодироваться поток. По умолчанию используется [`locale.getpreferredencoding(False)`](https://python-all.ru/3.7/library/locale.html#locale.getpreferredencoding).536537*errors* – необязательная строка, которая задаёт, как обрабатывать ошибки кодирования и декодирования. Передайте `'strict'`, чтобы возбудить исключение [`ValueError`](https://python-all.ru/3.7/library/exceptions.html#ValueError) при ошибке кодирования (значение по умолчанию `None` имеет тот же эффект), или `'ignore'`, чтобы игнорировать ошибки. (Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.) `'replace'` приводит к вставке замещающего маркера (например, `'?'`) в местах с некорректными данными. `'backslashreplace'` заменяет некорректные данные escape-последовательностью с обратной косой чертой. При записи можно использовать `'xmlcharrefreplace'` (замена на соответствующий XML-символьный объект) или `'namereplace'` (замена на escape-последовательности `\N{...}`). Любое другое имя обработчика ошибок, зарегистрированное с помощью [`codecs.register_error()`](https://python-all.ru/3.7/library/codecs.html#codecs.register_error), также допустимо.538539Параметр *newline* управляет обработкой концов строк. Он может принимать значения `None`, `''`, `'\n'`, `'\r'` и `'\r\n'`. Работает следующим образом:540541- При чтении данных из потока, если *newline* равно `None`, включается режим [универсальных символов новой строки](https://python-all.ru/3.7/glossary.html#term-universal-newlines). Строки во входных данных могут заканчиваться на `'\n'`, `'\r'` или `'\r\n'`, и они преобразуются в `'\n'` перед возвратом вызывающему коду. Если оно равно `''`, режим универсальных символов новой строки включен, но концы строк возвращаются вызывающему коду без преобразования. Если оно имеет любое другое допустимое значение, входные строки завершаются только указанной строкой, и конец строки возвращается вызывающему коду без преобразования.542- При записи в поток, если *newline* равен `None`, все символы `'\n'` преобразуются в системный разделитель строк по умолчанию [`os.linesep`](https://python-all.ru/3.7/library/os.html#os.linesep). Если *newline* равен `''` или `'\n'`, преобразование не выполняется. Если *newline* равен любому другому допустимому значению, все символы `'\n'` преобразуются в заданную строку.543544Если *line\_buffering* равен `True`, то `flush()` подразумевается, когда вызов write содержит символ новой строки или возврата каретки.545546Если *write\_through* равен `True`, вызовы `write()` гарантированно не буферизируются: любые данные, записанные в объект [`TextIOWrapper`](https://python-all.ru/3.7/library/io.html#io.TextIOWrapper), немедленно передаются его базовому двоичному *буферу*.547548Изменено в версии 3.3: Добавлен аргумент *write\_through*.549550Изменено в версии 3.3: Значение *encoding* по умолчанию теперь равно `locale.getpreferredencoding(False)` вместо `locale.getpreferredencoding()`. Не изменяйте временно кодировку локали с помощью [`locale.setlocale()`](https://python-all.ru/3.7/library/locale.html#locale.setlocale), используйте текущую кодировку локали вместо предпочитаемой пользователем.551552[`TextIOWrapper`](https://python-all.ru/3.7/library/io.html#io.TextIOWrapper) предоставляет следующие члены в дополнение к членам [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase) и его родительских классов:553554#### `line_buffering`555556Определяет, включена ли построчная буферизация.557558#### `write_through`559560Определяет, передаются ли данные записи немедленно в нижележащий двоичный буфер.561562Добавлено в версии 3.7.563564#### `reconfigure(*[, encoding][, errors][, newline][, line_buffering][, write_through])`565566Перенастраивает этот текстовый поток, используя новые значения для *encoding*, *errors*, *newline*, *line\_buffering* и *write\_through*.567568Неуказанные параметры сохраняют текущие настройки, за исключением того, что `errors='strict'` используется, когда *encoding* указан, а *errors* не указан.569570Невозможно изменить кодировку или newline, если из потока уже были прочитаны некоторые данные. Однако изменить кодировку после записи можно.571572Этот метод выполняет неявный сброс потока перед установкой новых параметров.573574Добавлено в версии 3.7.575576#### `class io.StringIO(initial_value='', newline='\n')`577578Поток в памяти для текстового ввода-вывода. Текстовый буфер отбрасывается при вызове метода [`close()`](https://python-all.ru/3.7/library/io.html#io.IOBase.close).579580Начальное значение буфера можно задать, передав *initial\_value*. Если включена трансляция символов новой строки, они будут кодироваться так, как если бы через [`write()`](https://python-all.ru/3.7/library/io.html#io.TextIOBase.write). Поток данных позиционируется в начало буфера.581582Аргумент *newline* работает так же, как в [`TextIOWrapper`](https://python-all.ru/3.7/library/io.html#io.TextIOWrapper). По умолчанию только символ `\n` считается концом строки, и никакого преобразования символов новой строки не выполняется. Если *newline* установлен в `None`, символы новой строки записываются как `\n` на всех платформах, но при чтении по-прежнему выполняется декодирование универсальных символов новой строки.583584[`StringIO`](https://python-all.ru/3.7/library/io.html#io.StringIO) предоставляет этот метод в дополнение к методам из [`TextIOBase`](https://python-all.ru/3.7/library/io.html#io.TextIOBase) и его родительских классов:585586#### `getvalue()`587588Возвращает `str`, содержащий всё содержимое буфера. Символы новой строки декодируются так, как если бы это делал [`read()`](https://python-all.ru/3.7/library/io.html#io.TextIOBase.read), хотя позиция потока не изменяется.589590Пример использования:591592```python593import io594595output = io.StringIO()596output.write('First line.\n')597print('Second line.', file=output)598599# Извлечь содержимое файла – это будет600# 'Первая строка.601Вторая строка.602'603contents = output.getvalue()604605# Закрыть объект и освободить буфер памяти –606# .getvalue() теперь будет вызывать исключение.607output.close()608```609610#### `class io.IncrementalNewlineDecoder`611612Вспомогательный кодек для декодирования символов новой строки в режиме [универсальных новых строк](https://python-all.ru/3.7/glossary.html#term-universal-newlines). Наследует [`codecs.IncrementalDecoder`](https://python-all.ru/3.7/library/codecs.html#codecs.IncrementalDecoder).613614## Производительность615616В этом разделе рассматривается производительность предоставленных конкретных реализаций ввода-вывода.617618### Двоичный ввод-вывод619620Читая и записывая только большие блоки данных, даже когда пользователь запрашивает один байт, буферизованный ввод-вывод скрывает любую неэффективность вызова и выполнения небуферизованных процедур ввода-вывода операционной системы. Выигрыш зависит от ОС и типа выполняемого ввода-вывода. Например, в некоторых современных ОС, таких как Linux, небуферизованный дисковый ввод-вывод может быть таким же быстрым, как буферизованный. Однако суть в том, что буферизованный ввод-вывод обеспечивает предсказуемую производительность независимо от платформы и нижележащего устройства. Поэтому для двоичных данных почти всегда предпочтительнее использовать буферизованный ввод-вывод, а не небуферизованный.621622### Текстовый ввод-вывод623624Текстовый ввод-вывод поверх двоичного хранилища (например, файла) значительно медленнее, чем двоичный ввод-вывод поверх того же хранилища, поскольку требует преобразований между юникодом и двоичными данными с использованием кодека символов. Это может стать заметным при обработке огромных объёмов текстовых данных, таких как большие файлы журналов. Кроме того, `TextIOWrapper.tell()` и `TextIOWrapper.seek()` оба довольно медленны из-за используемого алгоритма реконструкции.625626[`StringIO`](https://python-all.ru/3.7/library/io.html#io.StringIO), однако, является встроенным контейнером юникода в памяти и будет демонстрировать скорость, аналогичную [`BytesIO`](https://python-all.ru/3.7/library/io.html#io.BytesIO).627628### Многопоточность629630Объекты [`FileIO`](https://python-all.ru/3.7/library/io.html#io.FileIO) потокобезопасны настолько, насколько потокобезопасны системные вызовы (например, `read(2)` в Unix), которые они обёртывают.631632Двоичные буферизованные объекты (экземпляры [`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader), [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter), [`BufferedRandom`](https://python-all.ru/3.7/library/io.html#io.BufferedRandom) и [`BufferedRWPair`](https://python-all.ru/3.7/library/io.html#io.BufferedRWPair)) защищают свои внутренние структуры с помощью блокировки; поэтому их можно безопасно вызывать из нескольких потоков одновременно.633634Объекты [`TextIOWrapper`](https://python-all.ru/3.7/library/io.html#io.TextIOWrapper) не являются потокобезопасными.635636### Повторный вход637638Двоичные буферизованные объекты (экземпляры [`BufferedReader`](https://python-all.ru/3.7/library/io.html#io.BufferedReader), [`BufferedWriter`](https://python-all.ru/3.7/library/io.html#io.BufferedWriter), [`BufferedRandom`](https://python-all.ru/3.7/library/io.html#io.BufferedRandom) и [`BufferedRWPair`](https://python-all.ru/3.7/library/io.html#io.BufferedRWPair)) не являются реентерабельными. Хотя в нормальных ситуациях повторные вызовы не возникают, они могут появиться при выполнении ввода-вывода в обработчике [`signal`](https://python-all.ru/3.7/library/signal.html#module-signal). Если поток пытается повторно войти в буферизованный объект, к которому он уже обращается, возбуждается [`RuntimeError`](https://python-all.ru/3.7/library/exceptions.html#RuntimeError). Обратите внимание, что это не запрещает другому потоку войти в буферизованный объект.639640Сказанное выше неявно относится и к текстовым файлам, так как функция [`open()`](https://python-all.ru/3.7/library/functions.html#open) оборачивает буферизованный объект внутрь [`TextIOWrapper`](https://python-all.ru/3.7/library/io.html#io.TextIOWrapper). Это включает стандартные потоки и, следовательно, также влияет на встроенную функцию [`print()`](https://python-all.ru/3.7/library/functions.html#print).641