io — Основные инструменты для работы с потоками
Исходный код: Lib/io.py
Обзор
Модуль io предоставляет основные возможности Python для работы с различными типами ввода-вывода. Существует три основных типа ввода-вывода: текстовый ввод-вывод, бинарный ввод-вывод и необработанный ввод-вывод. Это общие категории, и для каждой из них можно использовать различные хранилища. Конкретный объект, относящийся к любой из этих категорий, называется объектом файла. Другие распространённые термины — поток и объект, подобный файлу.
Независимо от своей категории, каждый конкретный объект потока также будет иметь различные возможности: он может быть только для чтения, только для записи или для чтения и записи. Он также может допускать произвольный произвольный доступ (переход вперёд или назад к любому месту) или только последовательный доступ (например, в случае сокета или канала).
Все потоки тщательно проверяют тип данных, которые вы им передаёте. Например, передача объекта str методу write() бинарного потока вызовет исключение TypeError. Точно так же передача объекта bytes методу write() текстового потока.
Изменено в версии 3.3: Операции, которые раньше вызывали IOError, теперь вызывают OSError, так как IOError теперь является псевдонимом OSError.
Текстовый ввод-вывод
Текстовый ввод-вывод ожидает и производит объекты str. Это означает, что всякий раз, когда хранилище имеет нативный формат байтов (например, в случае файла), кодирование и декодирование данных осуществляется прозрачно, а также выполняется необязательное преобразование платформенно-зависимых символов новой строки.
Самый простой способ создать текстовый поток — с помощью open(), при необходимости указав кодировку:
f = open("myfile.txt", "r", encoding="utf-8")
В памяти также доступны текстовые потоки в виде объектов StringIO:
f = io.StringIO("some initial text data")
Подробное описание API текстового потока приведено в документации TextIOBase.
Бинарный ввод-вывод
Бинарный ввод-вывод (также называемый буферизованным вводом-выводом) ожидает объекты, подобные байтам и производит объекты bytes. Не выполняется кодирование, декодирование или преобразование символов новой строки. Эта категория потоков может использоваться для всех типов данных, не являющихся текстом, а также когда требуется ручной контроль над обработкой текстовых данных.
Самый простой способ создать бинарный поток — с помощью open() с 'b' в строке режима:
f = open("myfile.jpg", "rb")
В памяти также доступны бинарные потоки в виде объектов BytesIO:
f = io.BytesIO(b"some initial binary data: \x00\x01")
Подробное описание API бинарного потока приведено в документации BufferedIOBase.
Другие модули библиотек могут предоставлять дополнительные способы создания текстовых или бинарных потоков. См., например, socket.socket.makefile().
Необработанный ввод-вывод
Необработанный ввод-вывод (также называемый небуферизованным вводом-выводом) обычно используется в качестве низкоуровневого строительного блока для бинарных и текстовых потоков; редко бывает полезно непосредственно манипулировать необработанным потоком из пользовательского кода. Тем не менее, вы можете создать необработанный поток, открыв файл в бинарном режиме с отключенным буферированием:
f = open("myfile.jpg", "rb", buffering=0)
Подробное описание API необработанного потока приведено в документации RawIOBase.
Интерфейс модуля высокого уровня
-
io.DEFAULT_BUFFER_SIZE -
Целое число, содержащее размер буфера по умолчанию, используемый классами буферизованного ввода-вывода модуля.
open()использует blksize файла (как получено с помощьюos.stat()), если это возможно.
-
io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) -
Это псевдоним для встроенной функции
open().Эта функция вызывает событие аудита событие аудита
openс аргументамиpath,modeиflags. Аргументыmodeиflagsмогут быть изменены или выведены из исходного вызова.
-
io.open_code(path) -
Открывает указанный файл в режиме
'rb'. Эта функция должна использоваться, когда необходимо рассматривать содержимое как исполняемый код.pathдолжен бытьstrи абсолютным путём.Поведение этой функции может быть переопределено предыдущим вызовом
PyFile_SetOpenCodeHook(). Однако, предполагая, чтоpathявляетсяstrи абсолютным путём,open_code(path)всегда должен вести себя так же, какopen(path, 'rb'). Переопределение поведения предназначено для дополнительной проверки или предварительной обработки файла.Введено в версии 3.8.
-
exception io.BlockingIOError -
Это псевдоним для встроенного исключения
BlockingIOError.
-
exception io.UnsupportedOperation -
Исключение, наследующее
OSErrorиValueError, которое возникает при вызове неподдерживаемой операции в потоке.
См. также
-
sys -
содержит стандартные потоки ввода-вывода:
sys.stdin,sys.stdoutиsys.stderr.
Иерархия классов
Реализация потоков ввода/вывода организована в виде иерархии классов. Сначала абстрактные базовые классы (ABC), которые используются для определения различных категорий потоков, а затем конкретные классы, предоставляющие стандартные реализации потоков.
Примечание
Абстрактные базовые классы также предоставляют реализацию по умолчанию для некоторых методов, чтобы помочь в реализации конкретных классов потоков. Например, BufferedIOBase предоставляет не оптимизированные реализации readinto() и readline().
В верхней части иерархии ввода/вывода находится абстрактный базовый класс IOBase. Он определяет базовый интерфейс потока. Однако следует отметить, что нет разделения между чтением и записью в потоки; реализации могут вызывать UnsupportedOperation, если они не поддерживают данную операцию.
Класс RawIOBase расширяет IOBase. Он отвечает за чтение и запись байтов в поток. FileIO наследуется от RawIOBase для предоставления интерфейса к файлам в файловой системе компьютера.
Класс BufferedIOBase отвечает за буферизацию в сыром потоке байтов (RawIOBase). Его подклассы, BufferedWriter, BufferedReader и BufferedRWPair буферизуют потоки, которые читаются, пишутся и читаются/записываются одновременно. BufferedRandom предоставляет буферизированный интерфейс для потоков с произвольным доступом. Другой подкласс BufferedIOBase, BytesIO, представляет собой поток байтов в оперативной памяти.
Класс TextIOBase, являющийся ещё одним подклассом IOBase, работает с потоками, байты которых представляют текст, и обрабатывает кодирование и декодирование в строки и из них. TextIOWrapper, который его расширяет, представляет собой буферизированный текстовый интерфейс к буферизованному потоку байтов (BufferedIOBase). Наконец, StringIO — это поток в оперативной памяти для текста.
Имена аргументов не являются частью спецификации, и только аргументы функции open() предназначены для использования в качестве ключевых аргументов.
В следующей таблице приведены сводные данные по ABC, предоставленные модулем io:
ABC | Наследует от | Методы-заглушки | Методы и свойства миксина |
|---|---|---|---|
|
| ||
| Наследованные методы | ||
| Наследованные методы | ||
| Наследованные методы |
Классы базового ввода-вывода
-
class io.IOBase -
Абстрактный базовый класс для всех классов ввода-вывода, работающих со потоками байтов. Публичного конструктора нет.
Этот класс предоставляет пустые абстрактные реализации многих методов, которые производные классы могут выборочно переопределять; по умолчанию реализации представляют файл, который нельзя читать, записывать или перемещать.
Несмотря на то, что
IOBaseне объявляетread()илиwrite(), так как их сигнатуры будут различаться, реализации и клиенты должны рассматривать эти методы как часть интерфейса. Кроме того, реализации могут генерировать исключениеValueError(илиUnsupportedOperation), когда вызываются операции, которые они не поддерживают.Основной тип, используемый для двоичных данных, считываемых или записываемых в файл, — это
bytes. В качестве аргументов методов также принимаются другие объекты-подобные байтам. Классы текстового ввода-вывода работают с даннымиstr.Обратите внимание, что вызов любого метода (даже запросов) на закрытом потоке не определен. Реализации могут генерировать
ValueErrorв этом случае.IOBase(и его подклассы) поддерживает протокол итератора, что означает, что объектIOBaseможет быть перебираемым, возвращая строки в потоке. Строки определяются немного по-разному в зависимости от того, является ли поток двоичным потоком (возвращаются байты) или текстовым потоком (возвращаются строковые данные). См.readline()ниже.IOBaseтакже является менеджером контекста и поэтому поддерживает операторwith. В этом примере file закрывается после завершения блока оператораwith, даже если возникает исключение:with open('spam.txt', 'w') as file: file.write('Spam and eggs!')IOBaseпредоставляет эти данные атрибуты и методы:-
close() -
Очистить и закрыть этот поток. Этот метод не имеет эффекта, если файл уже закрыт. После закрытия файла любая операция с файлом (например, чтение или запись) сгенерирует исключение
ValueError.Для удобства разрешено вызывать этот метод более одного раза; однако только первый вызов будет иметь эффект.
-
closed -
Trueесли поток закрыт.
-
fileno() -
Возвращает дескриптор базового файла (целое число) потока, если он существует. Если объект IO не использует дескриптор файла, генерируется исключение
OSError.
-
flush() -
Очистить буферы записи потока, если применимо. Это ничего не делает для потоков только для чтения и неблокирующих потоков.
-
isatty() -
Возвращает
True, если поток интерактивный (т. е. подключен к терминалу/устройству tty).
-
readable() -
Возвращает
True, если из потока можно читать. ЕслиFalse,read()вызоветOSError.
-
readline(size=-1) -
Прочитать и вернуть одну строку из потока. Если задан параметр size, будет прочитано не более size байтов.
Разделитель строки всегда
b'\n'для двоичных файлов; для текстовых файлов аргумент newline кopen()может быть использован для выбора разделителя(ей) строки.
-
readlines(hint=-1) -
Прочитать и вернуть список строк из потока. hint может быть задан для управления количеством считываемых строк: не будет считываться больше строк, если общий размер (в байтах/символах) всех строк до сих пор превышает hint.
Обратите внимание, что уже можно итерироваться по объектам файлов, используя
for line in file: ..., без вызоваfile.readlines().
-
seek(offset, whence=SEEK_SET) -
Изменить позицию потока на заданный байтовый offset. offset интерпретируется относительно позиции, указанной параметром whence. Значение по умолчанию для whence равно
SEEK_SET. Значения для whence:-
SEEK_SETили0– начало потока (по умолчанию); offset должен быть нулевым или положительным -
SEEK_CURили1– текущая позиция потока; offset может быть отрицательным -
SEEK_ENDили2– конец потока; offset обычно отрицательный
Возвращает новую абсолютную позицию.
Добавлена в версии 3.1: Постоянные
SEEK_*.Добавлена в версии 3.3: Некоторые операционные системы могут поддерживать дополнительные значения, такие как
os.SEEK_HOLEилиos.SEEK_DATA. Допустимые значения для файла могут зависеть от того, открыт ли он в текстовом или двоичном режиме. -
-
seekable() -
Возвращает
True, если поток поддерживает произвольный доступ. ЕслиFalse,seek(),tell()иtruncate()вызовутOSError.
-
tell() -
Возвращает текущую позицию потока.
-
truncate(size=None) -
Изменить размер потока до заданного размера size в байтах (или текущую позицию, если size не указан). Текущая позиция потока не изменяется. Это изменение размера может увеличить или уменьшить текущий размер файла. В случае расширения содержимое новой области файла зависит от платформы (на большинстве систем дополнительные байты заполняются нулями). Возвращается новый размер файла.
Изменено в версии 3.5: Windows теперь будет заполнять файлы нулями при расширении.
-
writable() -
Возвращает
True, если поток поддерживает запись. ЕслиFalse,write()иtruncate()вызовутOSError.
-
writelines(lines) -
Записать список строк в поток. Разделители строк не добавляются, поэтому обычно каждая из предоставленных строк имеет разделитель строки в конце.
-
-
class io.RawIOBase -
Базовый класс для операций ввода-вывода в сыром двоичном формате. Он наследует
IOBase. Публичного конструктора нет.Сырой двоичный ввод-вывод обычно предоставляет низкоуровневый доступ к базовому устройству или API операционной системы, не пытаясь инкапсулировать его в высокоуровневые примитивы (это оставлено для буферизованного ввода-вывода и текстового ввода-вывода, описанных позднее на этой странице).
В дополнение к атрибутам и методам из
IOBase,RawIOBaseпредоставляет следующие методы:-
read(size=-1) -
Считывает до size байт из объекта и возвращает их. Для удобства, если size не указано или равно -1, возвращаются все байты до EOF. В противном случае выполняется только один системный вызов. Возвращается меньше чем size байт, если системный вызов возвращает меньше size байт.
Если возвращается 0 байт, а size не было равно 0, это указывает на конец файла. Если объект находится в режиме без блокировки и байты недоступны, возвращается
None.Реализация по умолчанию обращается к
readall()иreadinto().
-
readall() -
Считывает и возвращает все байты из потока до EOF, используя несколько вызовов потока при необходимости.
-
readinto(b) -
Считывает байты в предварительно выделенный, записываемый объект-подобный байтам b и возвращает количество считанных байт. Например, b может быть
bytearray. Если объект находится в режиме без блокировки и байты недоступны, возвращаетсяNone.
-
write(b) -
Записывает заданный объект-подобный байтам, b, в базовый сырой поток и возвращает количество записанных байт. Это может быть меньше длины b в байтах, в зависимости от особенностей базового сырого потока, особенно если он находится в режиме без блокировки.
Noneвозвращается, если сырой поток настроен на работу без блокировки, и ни один байт не может быть немедленно записан в него. Вызывающая сторона может освободить или изменить b после возвращения этого метода, поэтому реализация должна обращаться к b только во время вызова метода.
-
-
class io.BufferedIOBase -
Базовый класс для двоичных потоков, поддерживающих какой-либо вид буферизации. Он наследует
IOBase. Публичного конструктора нет.Основное отличие от
RawIOBaseзаключается в том, что методыread(),readinto()иwrite()будут пытаться (соответственно) прочитать как можно больше входных данных или обработать весь предоставленный выход, за счет возможного выполнения более одного системного вызова.Кроме того, эти методы могут вызывать
BlockingIOError, если базовый сырой поток находится в режиме без блокировки и не может принять или передать достаточно данных; в отличие от своих аналогов вRawIOBase, они никогда не вернутNone.Кроме того, метод
read()не имеет реализации по умолчанию, которая обращается кreadinto().Типичная реализация
BufferedIOBaseне должна наследоваться от реализацииRawIOBase, но должна её обернуть, как это делаютBufferedWriterиBufferedReader.BufferedIOBaseпредоставляет или переопределяет эти методы и атрибуты помимо тех, что изIOBase:-
raw -
Базовый сырой поток (экземпляр
RawIOBase), с которым работаетBufferedIOBase. Это не часть APIBufferedIOBaseи может отсутствовать в некоторых реализациях.
-
detach() -
Отделить базовый сырой поток от буфера и вернуть его.
После отделения сырого потока, буфер находится в непригодном для использования состоянии.
Некоторые буферы, например
BytesIO, не имеют понятия о единственном сыром потоке, который нужно вернуть из этого метода. Они вызываютUnsupportedOperation.Введено в версии 3.1.
-
read(size=-1) -
Считывает и возвращает до size байт. Если аргумент опущен,
None, или отрицательный, данные считываются и возвращаются до тех пор, пока не будет достигнут конец файла. Если поток уже находится в конце файла, возвращается пустойbytes.Если аргумент положительный, а базовый сырой поток не интерактивный, могут быть выполнены несколько операций чтения сырых данных для удовлетворения количества байтов (если при этом не будет достигнут конец файла). Но для интерактивных сырых потоков выполняется не более одной операции чтения, и короткий результат не означает, что конец файла близок.
Если базовый сырой поток находится в режиме без блокировки и в данный момент нет доступных данных, возникает
BlockingIOError.
-
read1([size]) -
Считывает и возвращает до size байт с выполнением не более одного вызова метода
read()(илиreadinto()) базового сырого потока. Это может быть полезно при реализации собственной буферизации поверх объектаBufferedIOBase.Если size равно
-1(по умолчанию), возвращается произвольное количество байтов (больше нуля, если не достигнут конец файла).
-
readinto(b) -
Считывает байты в предварительно выделенный, записываемый объект-подобный байтам b и возвращает количество считанных байт. Например, b может быть
bytearray.Как и
read(), могут выполняться несколько операций чтения из базового сырого потока, если последний не интерактивный.Если базовый сырой поток находится в режиме без блокировки и в данный момент нет доступных данных, возникает
BlockingIOError.
-
readinto1(b) -
Считывает байты в предварительно выделенный, записываемый объект-подобный байтам b, используя не более одного вызова метода
read()(илиreadinto()) базового сырого потока. Возвращает количество считанных байт.Если базовый сырой поток находится в режиме без блокировки и в данный момент нет доступных данных, возникает
BlockingIOError.Введено в версии 3.5.
-
write(b) -
Записывает заданный объект-подобный байтам, b, и возвращает количество записанных байт (всегда равное длине b в байтах, так как если запись завершится неудачно, будет вызвано исключение
OSError). В зависимости от фактической реализации, эти байты могут быть немедленно записаны в базовый поток или сохранены в буфере для повышения производительности и снижения задержек.При работе в режиме без блокировки, если данные необходимо было записать в сырой поток, но он не смог принять все данные без блокировки, возникает
BlockingIOError.Вызывающая сторона может освободить или изменить b после возвращения этого метода, поэтому реализация должна обращаться к b только во время вызова метода.
-
Ввод/вывод необработанных файлов
-
class io.FileIO(name, mode='r', closefd=True, opener=None) -
FileIOпредставляет собой файл на уровне ОС, содержащий данные в байтовом формате. Он реализует интерфейсRawIOBase(и, следовательно, интерфейсIOBase).Имя может быть одним из двух:
- строка символов или объект
bytes, представляющий путь к файлу, который будет открыт. В этом случае closefd должен бытьTrue(по умолчанию), в противном случае будет поднято исключение. - целое число, представляющее номер существующего дескриптора файла на уровне ОС, к которому полученный объект
FileIOполучит доступ. Когда объект FileIO закрывается, этот дескриптор также будет закрыт, если только closefd не задан какFalse.
Режим может быть
'r','w','x'или'a'для чтения (по умолчанию), записи, эксклюзивного создания или добавления. Файл будет создан, если он не существует при открытии для записи или добавления; он будет обрезан при открытии для записи.FileExistsErrorбудет поднято, если он уже существует при открытии для создания. Открытие файла для создания подразумевает запись, поэтому этот режим работает аналогично'w'. Добавьте'+'к режиму, чтобы разрешить одновременное чтение и запись.Методы
read()(при вызове с положительным аргументом),readinto()иwrite()этого класса будут выполнять только один системный вызов.Пользовательский открыватель можно использовать, передав вызываемый объект как opener. Базовый дескриптор файла для объекта файла затем получается путём вызова opener с (name, flags). opener должен возвращать открытый дескриптор файла (передача
os.openв качестве opener приводит к функциональности, аналогичной передачеNone).Созданный файл является не наследуемым.
См. встроенную функцию
open()для примеров использования параметра opener.Изменено в версии 3.3: Добавлен параметр opener. Добавлена возможность открытия в режиме
'x'.Изменено в версии 3.4: Файл теперь не наследуется.
В дополнение к атрибутам и методам из
IOBaseиRawIOBase,FileIOпредоставляет следующие атрибуты данных:-
mode -
Режим, указанный в конструкторе.
-
name -
Имя файла. Это дескриптор файла, когда имя не задано в конструкторе.
- строка символов или объект
Буферизованные потоки
Буферизованные потоки ввода-вывода предоставляют интерфейс более высокого уровня для устройства ввода-вывода, чем прямой ввод-вывод.
-
class io.BytesIO([initial_bytes]) -
Реализация потока, использующая буфер байтов в памяти. Она наследует
BufferedIOBase. Буфер удаляется при вызове методаclose().Необязательный аргумент initial_bytes — это объект, подобный байтам, содержащий начальные данные.
BytesIOпредоставляет или переопределяет следующие методы помимо методов изBufferedIOBaseиIOBase:-
getbuffer() -
Возвращает читаемый и записываемый вид содержимого буфера без копирования. Кроме того, изменение вида прозрачно обновит содержимое буфера:
>>> b = io.BytesIO(b"abcdef") >>> view = b.getbuffer() >>> view[2:4] = b"56" >>> b.getvalue() b'ab56ef'
Примечание
Пока существует представление, объект
BytesIOне может быть изменён по размеру или закрыт.Добавлена в версии 3.2.
-
getvalue() -
Возвращает
bytes, содержащий всё содержимое буфера.
-
read1([size]) -
В
BytesIO, это то же самое, чтоread().Изменено в версии 3.7: Аргумент size теперь является необязательным.
-
readinto1(b) -
В
BytesIO, это то же самое, чтоreadinto().Добавлена в версии 3.5.
-
-
class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE) -
Буфер, обеспечивающий доступ более высокого уровня к читаемому, последовательному объекту
RawIOBase. Он наследуетBufferedIOBase. При чтении данных из этого объекта может быть запрошено большее количество данных из исходного потока и сохранено во внутреннем буфере. Буферизованные данные затем могут быть возвращены непосредственно при последующих чтениях.Конструктор создаёт
BufferedReaderдля заданного читаемого потока raw и buffer_size. Если buffer_size опущен, используетсяDEFAULT_BUFFER_SIZE.BufferedReaderпредоставляет или переопределяет следующие методы помимо методов изBufferedIOBaseиIOBase:-
peek([size]) -
Возвращает байты из потока без продвижения позиции. Для удовлетворения вызова выполняется не более одного чтения в исходном потоке. Количество возвращённых байтов может быть меньше или больше запрошенного.
-
read([size]) -
Читает и возвращает size байт, или, если size не задан или отрицателен, до конца потока или если вызов чтения заблокируется в режиме без блокировки.
-
read1([size]) -
Читает и возвращает до size байт с использованием только одного вызова исходного потока. Если в буфере есть хотя бы один байт, возвращаются только буферизованные байты. В противном случае выполняется один вызов чтения из исходного потока.
Изменено в версии 3.7: Аргумент size теперь является необязательным.
-
-
class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE) -
Буфер, обеспечивающий доступ более высокого уровня к записываемому, последовательному объекту
RawIOBase. Он наследуетBufferedIOBase. При записи в этот объект данные обычно помещаются во внутренний буфер. Буфер будет записан в исходный объектRawIOBaseв различных условиях, включая:- когда буфер становится слишком маленьким для всех ожидающих данных;
- когда вызывается
flush(); - когда запрашивается
seek()(для объектовBufferedRandom); - когда объект
BufferedWriterзакрывается или уничтожается.
Конструктор создаёт
BufferedWriterдля заданного записываемого потока raw. Если buffer_size не задан, по умолчанию используетсяDEFAULT_BUFFER_SIZE.BufferedWriterпредоставляет или переопределяет следующие методы помимо методов изBufferedIOBaseиIOBase:-
flush() -
Вынуждает запись байтов, хранящихся в буфере, в исходный поток. Если исходный поток заблокирован, должен быть поднят
BlockingIOError.
-
write(b) -
Записывает объект, подобный байтам, b, и возвращает количество записанных байт. При работе в режиме без блокировки, если буфер необходимо записать, а исходный поток заблокирован, поднимается
BlockingIOError.
-
class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE) -
Буферизованный интерфейс для потоков с произвольным доступом. Он наследует
BufferedReaderиBufferedWriter.Конструктор создаёт читатель и писатель для потока с произвольным доступом, заданного в первом аргументе. Если buffer_size опущен, по умолчанию используется
DEFAULT_BUFFER_SIZE.BufferedRandomспособен на всё, на что способныBufferedReaderилиBufferedWriter. Кроме того,seek()иtell()гарантированно реализованы.
-
class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE) -
Объект буферизованного ввода-вывода, объединяющий два однонаправленных объекта
RawIOBase— один для чтения, другой для записи — в единый двунаправленный конечный пункт. Он наследуетBufferedIOBase.reader и writer — это объекты
RawIOBase, которые соответственно читаемы и записываемы. Если buffer_size опущен, по умолчанию используетсяDEFAULT_BUFFER_SIZE.BufferedRWPairреализует все методыBufferedIOBase, за исключениемdetach(), который вызываетUnsupportedOperation.Предупреждение
BufferedRWPairне пытается синхронизировать доступ к своим исходным потокам. Не следует передавать ему один и тот же объект в качестве читателя и писателя; используйтеBufferedRandomвместо этого.
Ввод/вывод текста
-
class io.TextIOBase -
Базовый класс для текстовых потоков. Этот класс предоставляет интерфейс на основе символов и строк для ввода-вывода потоков. Он наследует
IOBase. Публичный конструктор отсутствует.TextIOBaseпредоставляет или переопределяет эти атрибуты данных и методы в дополнение к тем, которые изIOBase:-
encoding -
Имя кодировки, используемой для декодирования байтов потока в строки и для кодирования строк в байты.
-
errors -
Настройка обработки ошибок декодера или кодировщика.
-
newlines -
Строка, кортеж строк или
None, указывающие на переводы строк, переведённые до сих пор. В зависимости от реализации и флагов конструктора, это может быть недоступно.
-
buffer -
Внутренний двоичный буфер (объект
BufferedIOBase), с которым работаетTextIOBase. Это не входит в APITextIOBaseи может отсутствовать в некоторых реализациях.
-
detach() -
Отсоединить внутренний двоичный буфер от
TextIOBaseи вернуть его.После отсоединения внутреннего буфера,
TextIOBaseнаходится в недоступном состоянии.Некоторые реализации
TextIOBase, такие какStringIO, могут не иметь концепции внутреннего буфера, и вызов этого метода вызоветUnsupportedOperation.Новое в версии 3.1.
-
read(size=-1) -
Прочитать и вернуть не более size символов из потока как одну строку
str. Если size отрицательное илиNone, читает до конца потока (EOF).
-
readline(size=-1) -
Прочитать до перевода строки или конца потока (EOF) и вернуть одну строку
str. Если поток уже в состоянии EOF, возвращается пустая строка.Если указано size, будет прочитано не более size символов.
-
seek(offset, whence=SEEK_SET) -
Изменить позицию потока на заданный offset. Поведение зависит от параметра whence. Значение по умолчанию для whence —
SEEK_SET.-
SEEK_SETили0: перейти к началу потока (по умолчанию); offset должен быть числом, возвращённымTextIOBase.tell(), или нулём. Любое другое значение offset приводит к неопределённому поведению. -
SEEK_CURили1: перейти к текущей позиции; offset должен быть нулём, это — не операция (все другие значения не поддерживаются). -
SEEK_ENDили2: перейти к концу потока; offset должен быть нулём (все другие значения не поддерживаются).
Возвращает новую абсолютную позицию как непонятное число.
Новое в версии 3.1: Константы
SEEK_*. -
-
tell() -
Возвращает текущую позицию потока как непонятное число. Число обычно не представляет количество байтов в подлежащем двоичном хранилище.
-
write(s) -
Записать строку s в поток и вернуть количество записанных символов.
-
-
class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False) -
Буферизованный текстовый поток над двоичным потоком
BufferedIOBase. Он наследуетTextIOBase.encoding указывает имя кодировки, которая будет использоваться для декодирования или кодирования потока. По умолчанию —
locale.getpreferredencoding(False).errors — необязательная строка, которая определяет, как обрабатывать ошибки кодирования и декодирования. Передайте
'strict'для повышения исключенияValueErrorпри ошибке кодирования (по умолчаниюNoneимеет тот же эффект), или передайте'ignore'для игнорирования ошибок. (Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.)'replace'вставляет маркер замены (например,'?') там, где есть некорректные данные.'backslashreplace'заменяет некорректные данные обратной косой чертой, последовательностью эскейпа. При записи,'xmlcharrefreplace'(замените соответствующей XML-ссылкой на символ) или'namereplace'(замените\N{...}последовательностями эскейпа) могут быть использованы. Любое другое имя обработки ошибок, зарегистрированное с помощьюcodecs.register_error(), также допустимо.newline управляет обработкой окончаний строк. Может быть
None,'','\n','\r', и'\r\n'. Он работает следующим образом:- При чтении входных данных из потока, если newline —
None, режим универсальных перевода строк включён. Строки ввода могут заканчиваться'\n','\r', или'\r\n', и они переводятся в'\n'перед возвратом вызывающему коду. Если это'', режим универсальных перевода строк включён, но окончания строк возвращаются вызывающему коду без перевода. Если у него есть другие допустимые значения, входные строки завершаются только указанной строкой, и окончание строки возвращается вызывающему коду без перевода. - При записи выходных данных в поток, если newline —
None, любые'\n'символы, записанные, переводятся в системный разделитель строк по умолчанию,os.linesep. Если newline —''или'\n', перевод не выполняется. Если newline имеет любое другое допустимое значение, любые'\n'символы, записанные, переводятся в заданную строку.
Если line_buffering —
True,flush()подразумевается, когда вызов write содержит символ перевода строки или возврат каретки.Если write_through —
True, вызовыwrite()гарантированно не буферизуются: любые данные, записанные в объектTextIOWrapper, обрабатываются немедленно его внутренним двоичным buffer.Изменено в версии 3.3: Аргумент write_through был добавлен.
Изменено в версии 3.3: Значение по умолчанию encoding теперь
locale.getpreferredencoding(False)вместоlocale.getpreferredencoding(). Не изменяйте временно кодировку локали с помощьюlocale.setlocale(), используйте кодировку текущей локали вместо предпочтительной кодировки пользователя.TextIOWrapperпредоставляет эти члены в дополнение к тем, которые изTextIOBaseи его родительских классов:-
line_buffering -
Включено ли буферизация строк.
-
write_through -
Передаются ли записи немедленно в подлежащий двоичный буфер.
Новое в версии 3.7.
-
reconfigure(*[, encoding][, errors][, newline][, line_buffering][, write_through]) -
Переконфигурировать этот текстовый поток, используя новые параметры для encoding, errors, newline, line_buffering и write_through.
Не указанные параметры сохраняют текущие настройки, за исключением
errors='strict'используется, когда encoding указан, но errors не указан.Невозможно изменить кодировку или переводы строк, если некоторые данные уже были прочитаны из потока. С другой стороны, изменение кодировки после записи возможно.
Этот метод выполняет неявную очистку потока перед установкой новых параметров.
Новое в версии 3.7.
- При чтении входных данных из потока, если newline —
-
class io.StringIO(initial_value='', newline='\n') -
Поток в оперативной памяти для текстового ввода-вывода. Буфер текста удаляется при вызове метода
close().Начальное значение буфера можно установить, указав initial_value. Если включена обработка символов новой строки, новые строки будут закодированы так же, как при вызове
write(). Поток позиционируется в начале буфера.Аргумент newline работает аналогично аргументу в
TextIOWrapper. По умолчанию рассматриваются только символы\nкак окончания строк и не выполняется перевод новых строк. Если newline установлено вNone, новые строки записываются как\nна всех платформах, но все равно выполняется универсальное декодирование новых строк при чтении.StringIOпредоставляет этот метод в дополнение к методам изTextIOBaseи его родительских классов:-
getvalue() -
Возвращает
str, содержащий всё содержимое буфера. Новые строки декодируются так же, как при вызовеread(), хотя позиция потока не изменяется.
Пример использования:
import io output = io.StringIO() output.write('First line.\n') print('Second line.', file=output) # Retrieve file contents -- this will be # 'First line.\nSecond line.\n' contents = output.getvalue() # Close object and discard memory buffer -- # .getvalue() will now raise an exception. output.close() -
-
class io.IncrementalNewlineDecoder -
Вспомогательный кодек, который декодирует новые строки для режима универсальных новых строк. Он наследует
codecs.IncrementalDecoder.
Производительность
Этот раздел обсуждает производительность предоставленных конкретных реализаций ввода-вывода.
Бинарный ввод-вывод
Читая и записывая только большие блоки данных, даже когда пользователь запрашивает один байт, буферизированный ввод-вывод скрывает любые неэффективности при вызове и выполнении системных вызовов операционной системы для небуферизированного ввода-вывода. Выигрыш зависит от ОС и типа выполняемого ввода-вывода. Например, на некоторых современных ОС, таких как Linux, небуферизированный ввод-вывод на диск может быть так же быстрым, как буферизированный ввод-вывод. Однако в целом буферизированный ввод-вывод обеспечивает предсказуемую производительность независимо от платформы и базового устройства. Поэтому почти всегда предпочтительнее использовать буферизированный ввод-вывод, чем небуферизированный ввод-вывод для бинарных данных.
Текстовый ввод-вывод
Текстовый ввод-вывод над двоичным хранилищем (например, файл) значительно медленнее, чем двоичный ввод-вывод над тем же хранилищем, потому что он требует преобразований между данными Unicode и двоичными данными с использованием кодировки символов. Это может стать заметным при обработке огромных объемов текстовых данных, таких как большие файлы журналов. Также TextIOWrapper.tell() и TextIOWrapper.seek() очень медленные из-за алгоритма реконструкции, используемого.
StringIO, однако, является родной контейнером Unicode в памяти и будет демонстрировать скорость, аналогичную BytesIO.
Многопоточность
FileIO объекты являются потокобезопасными в той мере, в какой системные вызовы операционной системы (например, read(2) под Unix), которые они оборачивают, тоже являются потокобезопасными.
Бинарные буферизованные объекты (экземпляры BufferedReader, BufferedWriter, BufferedRandom и BufferedRWPair) защищают свои внутренние структуры с помощью блокировки; поэтому их безопасно вызывать из нескольких потоков одновременно.
TextIOWrapper объекты не являются потокобезопасными.
Реентерабельность
Бинарные буферизованные объекты (экземпляры BufferedReader, BufferedWriter, BufferedRandom и BufferedRWPair) не являются реентерабельными. Хотя реентерабельные вызовы не будут происходить в обычных ситуациях, они могут возникнуть при выполнении ввода-вывода в обработчике signal. Если поток пытается повторно войти в буферизованный объект, к которому он уже имеет доступ, будет поднято исключение RuntimeError. Обратите внимание, что это не запрещает другому потоку войти в буферизованный объект.
Вышесказанное подразумевает расширение до текстовых файлов, поскольку функция open() будет оборачивать буферизованный объект внутри TextIOWrapper. Это включает стандартные потоки и, следовательно, влияет на встроенную функцию print() также.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/io.html