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.
Кодировка текста
По умолчанию кодировка TextIOWrapper и open() зависит от локали (locale.getencoding()).
Однако многие разработчики забывают указывать кодировку при открытии текстовых файлов, закодированных в UTF-8 (например, JSON, TOML, Markdown и т. д.), так как большинство платформ Unix по умолчанию используют локаль UTF-8. Это приводит к ошибкам, поскольку кодировка локали не UTF-8 для большинства пользователей Windows. Например:
# May not work on Windows when non-ASCII characters in the file.
with open("README.md") as f:
long_description = f.read()
Поэтому настоятельно рекомендуется явно указывать кодировку при открытии текстовых файлов. Если вы хотите использовать UTF-8, передайте encoding="utf-8". Чтобы использовать текущую кодировку локали, encoding="locale" поддерживается с Python 3.10.
См. также
- Режим Python UTF-8
-
Режим Python UTF-8 может быть использован для изменения кодировки по умолчанию с кодировки локали на UTF-8.
- PEP 686
-
Python 3.15 сделает Режим Python UTF-8 значением по умолчанию.
Включение предупреждения EncodingWarning
Добавлено в версии 3.10: См. PEP 597 для получения более подробной информации.
Чтобы определить место использования кодировки локали по умолчанию, вы можете включить опцию командной строки -X warn_default_encoding или установить переменную среды PYTHONWARNDEFAULTENCODING, которая выведет EncodingWarning, когда используется кодировка по умолчанию.
Если вы предоставляете API, который использует open() или TextIOWrapper и передаёт encoding=None в качестве параметра, вы можете использовать text_encoding(), чтобы вызывающие стороны API выводили EncodingWarning, если они не передают encoding. Однако рекомендуется использовать UTF-8 по умолчанию (т. е. encoding="utf-8") для новых API.
Интерфейс модуля высокого уровня
-
io.DEFAULT_BUFFER_SIZE -
Целое число, содержащее размер буфера по умолчанию, используемый классами буферизованного ввода-вывода модуля.
open()использует размер блока файла (полученный с помощьюos.stat()), если это возможно.
-
io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) -
Это псевдоним для встроенной функции
open().Эта функция вызывает событие аудита
openс аргументами путь, режим и флаги. Аргументы режим и флаги могут быть изменены или выведены из исходного вызова.
-
io.open_code(path) -
Открывает предоставленный файл в режиме
'rb'. Эта функция должна использоваться, когда требуется обращение с содержимым как с исполняемым кодом.путь должен быть
strи абсолютным путём.Поведение этой функции может быть переопределено предыдущим вызовом
PyFile_SetOpenCodeHook(). Однако, предполагая, что путь являетсяstrи абсолютным путём,open_code(path)всегда должно вести себя так же, какopen(path, 'rb'). Переопределение поведения предназначено для дополнительной валидации или предобработки файла.Добавлен в версии 3.8.
-
io.text_encoding(encoding, stacklevel=2, /) -
Это вспомогательная функция для вызываемых объектов, которые используют
open()илиTextIOWrapperи имеют параметрencoding=None.Эта функция возвращает кодировку, если она не
None. В противном случае она возвращает"locale"или"utf-8"в зависимости от режима UTF-8.Эта функция генерирует
EncodingWarning, еслиsys.flags.warn_default_encodingистинно и кодировкаNone. stacklevel указывает, где генерируется предупреждение. Например:def read_text(path, encoding=None): encoding = io.text_encoding(encoding) # stacklevel=2 with open(path, encoding) as f: return f.read()В этом примере
EncodingWarningгенерируется для вызывающего объектаread_text().Дополнительную информацию см. в разделе Кодировка текста.
Добавлен в версии 3.10.
Изменено в версии 3.11:
text_encoding()возвращает “utf-8”, когда режим UTF-8 включен и кодировкаNone.
-
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 расширяет IOBase. Он обрабатывает буферизацию в сыром двоичном потоке (RawIOBase). Его подклассы, BufferedWriter, BufferedReader и BufferedRWPair буферизуют сырые двоичные потоки, которые являются соответственно только для записи, только для чтения и для чтения/записи. BufferedRandom предоставляет буферизованный интерфейс к потокам с возможностью позиционирования.
Другой подкласс BufferedIOBase, BytesIO, представляет собой поток байтов в памяти.
Класс TextIOBase расширяет IOBase. Он обрабатывает потоки, байты которых представляют текст, и обрабатывает кодирование и декодирование в строки и из строк. TextIOWrapper, который расширяет TextIOBase, представляет собой буферизованный текстовый интерфейс к буферизованному сырому потоку (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.
Значения hint
0или меньше, а такжеNone, рассматриваются как отсутствие подсказки.Обратите внимание, что уже можно итерировать по объектам файлов, используя
for line in file: ..., без вызоваfile.readlines().
-
seek(offset, whence=os.SEEK_SET, /) -
Изменить позицию потока на заданный байтовый смещение, интерпретируемое относительно позиции, указанной whence, и вернуть новую абсолютную позицию. Значения для whence:
-
os.SEEK_SETили0– начало потока (по умолчанию); offset должно быть нулевым или положительным -
os.SEEK_CURили1– текущая позиция потока; offset может быть отрицательным -
os.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 операционной системы, и не пытаются инкапсулировать его в высокоуровневые примитивы (эта функциональность выполняется на более высоком уровне в буферизованных двоичных потоках и текстовых потоках, описанных позже на этой странице).
RawIOBaseпредоставляет эти методы в дополнение к методам изIOBase:-
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=-1, /) -
Прочитать и вернуть до 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) -
Необработанный двоичный поток, представляющий файл на уровне ОС, содержащий данные в байтах. Он наследуется от
RawIOBase.Имя name может быть одним из двух:
- строка символов или объект
bytes, представляющий путь к файлу, который будет открыт. В этом случае closefd должен бытьTrue(по умолчанию), иначе будет возбуждено исключение. - целое число, представляющее номер существующего дескриптора файла на уровне ОС, к которому объект
FileIOпредоставит доступ. При закрытии объекта FileIO этот fd будет закрыт тоже, если только 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: Файл теперь не наследуется.
FileIOпредоставляет следующие атрибуты данных в дополнение к тем, которые есть уRawIOBaseиIOBase:-
mode -
Режим, заданный в конструкторе.
-
name -
Имя файла. Это дескриптор файла, когда имя не задано в конструкторе.
- строка символов или объект
Буферизованные потоки
Буферизованные потоки ввода-вывода предоставляют интерфейс более высокого уровня к устройству ввода-вывода, чем потоки прямого ввода-вывода.
-
class io.BytesIO(initial_bytes=b'') -
Бинарный поток, использующий буфер байтов в оперативной памяти. Он наследуется от
BufferedIOBase. Буфер удаляется при вызове методаclose().Необязательный аргумент initial_bytes — это объект типа 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=-1, /) -
В
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=0, /) -
Возвращает байты из потока без изменения позиции. Для удовлетворения запроса выполняется не более одного чтения из потока низкого уровня.
-
read(size=-1, /) -
Читает и возвращает size байтов или, если size не задан или отрицателен, до конца файла или до того момента, когда вызов чтения заблокируется в режиме без блокировки.
-
read1(size=-1, /) -
Читает и возвращает до 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, /) -
Записывает объект типа bytes b и возвращает количество записанных байтов. В режиме без блокировки, если буфер нужно записать, но поток низкого уровня блокируется, возникает ошибка
BlockingIOError.
-
class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE) -
Буферизованный двоичный поток, обеспечивающий доступ более высокого уровня к потоку с возможностью поиска
RawIOBase. Он наследуется от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не пытается синхронизировать доступ к базовым потокам. Не следует передавать один и тот же объект как reader, так и writer; используйте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, читается до конца потока.
-
readline(size=-1, /) -
Прочитать до новой строки или конца потока и вернуть одиночную
str. Если в потоке уже достигнут конец, возвращается пустая строка.Если указано 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.getencoding().encoding="locale"можно использовать для явного указания кодировки текущего локали. Дополнительную информацию см. в разделе Кодировка текста.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 имеет значение'', режим универсальных новых строк включен, но окончания строк возвращаются вызывающей стороне без преобразования. Если newline имеет любое другое допустимое значение, строки ввода завершаются только указанной строкой, а окончание строки возвращается вызывающей стороне без преобразования. - При записи данных в поток, если newline имеет значение
None, все символы'\n'преобразуются в стандартный разделитель строк системыos.linesep. Если newline имеет значение''или'\n', преобразования не происходит. Если newline имеет любое другое допустимое значение, все символы'\n'преобразуются в указанную строку.
Если line_buffering имеет значение
True,flush()подразумевается, когда вызов write содержит символ новой строки или возврата каретки.Если write_through имеет значение
True, вызовыwrite()гарантированно не буферизуются: любые данные, записанные в объектTextIOWrapper, немедленно обрабатываются его базовым двоичным буфером.Изменено в версии 3.3: Добавлен аргумент write_through.
Изменено в версии 3.3: Значение по умолчанию для encoding теперь
locale.getpreferredencoding(False)вместоlocale.getpreferredencoding(). Не изменяйте временную кодировку локали с помощьюlocale.setlocale(), используйте кодировку текущей локали вместо предпочтительной кодировки пользователя.Изменено в версии 3.10: Аргумент encoding теперь поддерживает псевдоним кодировки
"locale".TextIOWrapperпредоставляет эти атрибуты данных и методы в дополнение к методамTextIOBaseиIOBase:-
line_buffering -
Включена ли буферизация строк.
-
write_through -
Передаются ли записи немедленно в базовый двоичный буфер.
Добавлен в версии 3.7.
-
reconfigure(*, encoding=None, errors=None, newline=None, line_buffering=None, write_through=None) -
Переконфигурировать этот текстовый поток, используя новые параметры для encoding, errors, newline, line_buffering и write_through.
Не указанные параметры сохраняют текущие значения, за исключением
errors='strict'используется, когда encoding указан, но errors не указан.Невозможно изменить кодировку или newline, если данные уже были прочитаны из потока. С другой стороны, изменение кодировки после записи возможно.
Этот метод выполняет неявное сброс потока перед установкой новых параметров.
Добавлен в версии 3.7.
Изменено в версии 3.11: Метод поддерживает
encoding="locale"опцию.
-
seek(cookie, whence=os.SEEK_SET, /) -
Установить позицию потока. Возвращает новую позицию потока как
int.Поддерживаются четыре операции, задаваемые следующими комбинациями аргументов:
-
seek(0, SEEK_SET): Перемотать в начало потока. -
seek(cookie, SEEK_SET): Восстановить предыдущую позицию; cookie должен быть числом, возвращённымtell(). -
seek(0, SEEK_END): Перейти к концу потока. -
seek(0, SEEK_CUR): Оставить текущую позицию потока неизменной.
Любые другие комбинации аргументов недопустимы и могут вызвать исключения.
См. также
-
-
tell() -
Возвращает позицию потока как числовое значение. Возвращаемое значение
tell()может быть передано вseek(), чтобы восстановить предыдущую позицию потока.
- При чтении данных из потока, если newline имеет значение
-
class io.StringIO(initial_value='', newline='\n') -
Текстовый поток, использующий буфер текстовых данных в памяти. Он наследуется от
TextIOBase.Буфер текстовых данных удаляется при вызове метода
close().Начальное значение буфера можно установить, передав initial_value. Если включена обработка новых строк, новые строки будут закодированы так, как если бы они были записаны методом
write(). Позиция потока устанавливается в начало буфера, что эмулирует открытие существующего файла в режимеw+, делая его готовым к записи с начала или перезаписи начального значения. Чтобы эмулировать открытие файла в режимеa+готовом к добавлению, используйтеf.seek(0, io.SEEK_END)для перемещения потока в конец буфера.Аргумент newline работает аналогично аргументу для
TextIOWrapper, за исключением того, что при записи данных в поток, если newline имеет значениеNone, новые строки записываются как\nна всех платформах.StringIOпредоставляет этот метод помимо методовTextIOBaseиIOBase:-
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 и двоичными данными с использованием кодека символов. Это может стать заметным при обработке больших объёмов текстовых данных, таких как большие файлы журналов. Кроме того, tell() и seek() оба довольно медленные из-за алгоритма реконструирования, используемого в них.
StringIO, однако, является родным контейнером Unicode в памяти и будет демонстрировать скорость, аналогичную скорости BytesIO.
Многопоточность
FileIO объекты являются потокобезопасными в той степени, в которой системные вызовы операционной системы (такие как read(2) под Unix), которые они оборачивают, являются потокобезопасными.
Бинарные буферизованные объекты (экземпляры BufferedReader, BufferedWriter, BufferedRandom и BufferedRWPair) защищают свои внутренние структуры с помощью блокировки; поэтому их можно безопасно вызывать из нескольких потоков одновременно.
TextIOWrapper объекты не являются потокобезопасными.
Реентерабельность
Бинарные буферизованные объекты (экземпляры BufferedReader, BufferedWriter, BufferedRandom и BufferedRWPair) не являются реентерабельными. Хотя реентерабельные вызовы не будут происходить в обычных ситуациях, они могут возникать при выполнении ввода-вывода в обработчике signal. Если поток пытается повторно войти в буферизованный объект, к которому он уже имеет доступ, генерируется исключение RuntimeError. Обратите внимание, что это не запрещает другому потоку войти в буферизованный объект.
Вышесказанное неявно распространяется на текстовые файлы, поскольку функция open() будет оборачивать буферизованный объект внутри TextIOWrapper. Это включает стандартные потоки и, следовательно, влияет на встроенную функцию print() также.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/io.html