io — Основные инструменты для работы с потоками
Новое в версии 2.6.
Модуль io предоставляет Python-интерфейсы для обработки потоков. В Python 2.x он предлагается в качестве альтернативы встроенному объекту file, а в Python 3.x он является стандартным интерфейсом для доступа к файлам и потокам.
Примечание
Поскольку этот модуль разработан в первую очередь для Python 3.x, следует учитывать, что все упоминания «байтов» в этом документе относятся к типу str (для которого bytes является псевдонимом), а все упоминания «текста» относятся к типу unicode. Кроме того, эти два типа не взаимозаменяемы в API модуля io.
Вверху иерархии ввода-вывода находится абстрактный базовый класс IOBase. Он определяет базовый интерфейс для потока. Однако следует отметить, что нет разделения между чтением и записью в потоки; реализации разрешается поднимать исключение IOError, если они не поддерживают заданную операцию.
Расширяющим IOBase является класс RawIOBase, который просто обрабатывает чтение и запись необработанных байтов в поток. FileIO наследуется от RawIOBase, предоставляя интерфейс для работы с файлами в файловой системе компьютера.
BufferedIOBase обрабатывает буферизацию потока необработанных байтов (RawIOBase). Его подклассы, BufferedWriter, BufferedReader и BufferedRWPair, буферизуют потоки, которые могут читаться, записываться и читаться-записываться одновременно. BufferedRandom предоставляет буферизованный интерфейс для потоков с произвольным доступом. BytesIO — это простой поток байтов в оперативной памяти.
Еще один подкласс IOBase, TextIOBase, обрабатывает потоки, байты которых представляют текст, и обрабатывает кодирование и декодирование из и в строки unicode. TextIOWrapper, который его расширяет, является буферизованным текстовым интерфейсом для буферизованного потока необработанных байтов (BufferedIOBase). И наконец, StringIO — это поток в оперативной памяти для текста Юникод.
Имена аргументов не являются частью спецификации, и только аргументы функции open() предназначены для использования в качестве именованных аргументов.
1. Интерфейс модуля
-
io.DEFAULT_BUFFER_SIZE -
Целое число, содержащее размер буфера по умолчанию, используемый буферизованными классами ввода-вывода модуля.
open()использует blksize файла (полученного с помощьюos.stat()), если это возможно.
-
io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True) -
Открыть файл и вернуть соответствующий поток. Если файл не может быть открыт, генерируется исключение
IOError.Файл может быть строкой, содержащей путь (абсолютный или относительный к текущей рабочей директории) открываемого файла, или целочисленным дескриптором файла, который нужно обернуть. (Если указан дескриптор файла, он будет закрыт при закрытии возвращённого объекта ввода-вывода, если не задано closefd равным
False.)Режим — это необязательная строка, определяющая режим открытия файла. По умолчанию используется
'r', что означает открытие для чтения в текстовом режиме. Другие распространённые значения —'w'для записи (обнуление файла, если он уже существует), и'a'для добавления (что на некоторых Unix-системах означает, что все записи добавляются в конец файла независимо от текущей позиции поиска). В текстовом режиме, если кодировка не задана, используемая кодировка зависит от платформы. (Для чтения и записи необработанных байтов используйте двоичный режим и не указывайте кодировку.) Доступные режимы:Символ
Значение
'r'открытие для чтения (по умолчанию)
'w'открытие для записи, предварительно обнуляя файл
'a'открытие для записи, добавление в конец файла, если он существует
'b'двоичный режим
't'текстовый режим (по умолчанию)
'+'открытие файла для обновления (чтения и записи)
'U'режим универсальных новых строк (для обратной совместимости; не следует использовать в новом коде)
Режим по умолчанию —
'rt'(открытие для чтения текста). Для двоичного произвольного доступа режим'w+b'открывает и обнуляет файл до 0 байтов, а'r+b'открывает файл без обнуления.Python различает файлы, открытые в двоичном и текстовом режимах, даже если операционная система этого не делает. Файлы, открытые в двоичном режиме (включая
'b'в аргументе mode), возвращают содержимое какbytesобъекты без какой-либо декодировки. В текстовом режиме (по умолчанию или когда't'включено в аргумент mode) содержимое файла возвращается какunicodeстроки, при этом байты сначала декодируются с использованием платформенно-зависимой кодировки или с использованием заданной кодировки, если она указана.buffering — это необязательное целое число, используемое для установки политики буферизации. Передайте 0, чтобы отключить буферизацию (разрешено только в двоичном режиме), 1, чтобы выбрать построчную буферизацию (только в текстовом режиме), и целое число > 1, чтобы указать размер буфера фиксированного размера. Если аргумент buffering не указан, политика буферизации по умолчанию работает следующим образом:
- Двоичные файлы буферизуются кусками фиксированного размера; размер буфера выбирается с помощью эвристики, пытающейся определить «размер блока» базового устройства и переходя к
DEFAULT_BUFFER_SIZE. На многих системах размер буфера обычно составляет 4096 или 8192 байта. - «Интерактивные» текстовые файлы (файлы, для которых
isatty()возвращает True) используют построчную буферизацию. Другие текстовые файлы используют политику, описанную выше для двоичных файлов.
encoding — это имя кодировки, используемой для декодирования или кодирования файла. Это должно использоваться только в текстовом режиме. Кодировка по умолчанию зависит от платформы (то, что возвращает
locale.getpreferredencoding()), но может использоваться любая кодировка, поддерживаемая Python. Список поддерживаемых кодировок см. в модулеcodecs.errors — это необязательная строка, определяющая, как обрабатывать ошибки кодирования и декодирования (не может быть использована в двоичном режиме). Передайте
'strict'для повышения исключенияValueErrorв случае ошибки кодирования (значение по умолчаниюNoneимеет тот же эффект), или передайте'ignore'для игнорирования ошибок. (Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.)'replace'вставляет маркер замены (например,'?') в случае некорректных данных. При записи можно использовать'xmlcharrefreplace'(замените соответствующим XML-символом) или'backslashreplace'(замените обрамлёнными в обратные косые скобки последовательностями). Любое другое имя обработки ошибок, зарегистрированное вcodecs.register_error(), также допустимо.newline управляет работой универсальных новых строк (применяется только к текстовому режиму). Он может быть
None,'','\n','\r', и'\r\n'. Он работает следующим образом:- При вводе, если newline равно
None, режим универсальных новых строк включён. Строки на вводе могут заканчиваться'\n','\r', или'\r\n', и они переводятся в'\n'перед возвращением вызывающей стороне. Если это'', режим универсальных новых строк включён, но окончания строк возвращаются вызывающей стороне без перевода. Если задано какое-либо другое допустимое значение, строки ввода заканчиваются только заданной строкой, а окончания строк возвращаются вызывающей стороне без перевода. - При выводе, если newline равно
None, все символы'\n'переводятся в системный разделитель строк по умолчанию,os.linesep. Если newline равно'', перевод не выполняется. Если newline имеет любое другое допустимое значение, все символы'\n'переводятся в заданную строку.
Если closefd равно
Falseи был передан дескриптор файла, а не имя файла, то базовый дескриптор файла останется открытым при закрытии файла. Если задано имя файла, closefd не влияет и должно бытьTrue(по умолчанию).Тип объекта файла, возвращаемого функцией
open(), зависит от режима. Когдаopen()используется для открытия файла в текстовом режиме ('w','r','wt','rt', и т.д.), он возвращает подклассTextIOBase(конкретноTextIOWrapper). При использовании для открытия файла в двоичном режиме с буферизацией возвращаемый класс является подклассомBufferedIOBase. Точный класс варьируется: в режиме чтения двоичных данных возвращаетсяBufferedReader; в режимах записи и добавления двоичных данных возвращаетсяBufferedWriter, а в режимах чтения/записи возвращаетсяBufferedRandom. При отключенной буферизации возвращается исходный поток, подклассRawIOBase,FileIO.Также можно использовать строку
unicodeилиbytesв качестве файла для чтения и записи. Для строкunicodeможно использоватьStringIOкак файл, открытый в текстовом режиме, а дляbytes—BytesIOкак файл, открытый в двоичном режиме. - Двоичные файлы буферизуются кусками фиксированного размера; размер буфера выбирается с помощью эвристики, пытающейся определить «размер блока» базового устройства и переходя к
-
exception io.BlockingIOError -
Исключение, генерируемое при блокировке в неблокирующем потоке. Оно наследуется от
IOError.Помимо атрибутов
IOError,BlockingIOErrorимеет один атрибут:-
characters_written -
Целое число, содержащее количество символов, записанных в поток перед блокировкой.
-
-
exception io.UnsupportedOperation -
Исключение, наследующее от
IOErrorиValueError, которое генерируется при вызове недопустимой операции для потока.
2. Классы базовых операций ввода-вывода
-
class io.IOBase -
Абстрактный базовый класс для всех классов ввода-вывода, работающих со потоками байтов. Публичного конструктора нет.
Этот класс предоставляет пустые абстрактные реализации многих методов, которые производные классы могут переопределять выборочно; по умолчанию реализации представляют файл, который нельзя читать, записывать или перемещать.
Несмотря на то, что
IOBaseне объявляетread(),readinto(), илиreadinto()из-за различий в их сигнатурах, реализации и клиенты должны рассматривать эти методы как часть интерфейса. Кроме того, реализации могут вызывать исключениеIOError, когда вызываются операции, которые они не поддерживают.Основной тип, используемый для двоичных данных, считываемых или записываемых в файл, — это
bytes(также известный какstr). Аргументы методов также могут бытьbytearrayилиmemoryviewмассивов байтов. В некоторых случаях, таких какreadinto(), требуется объект для записи, например,bytearray. Классы текстового ввода-вывода работают с даннымиunicode.Изменено в версии 2.7: Реализации должны поддерживать аргументы
memoryview.Обратите внимание, что вызов любого метода (даже запросов) для закрытого потока является неопределённым. В этом случае реализации могут вызывать
IOError.IOBase (и его подклассы) поддерживают протокол итератора, что означает, что объект
IOBaseможет быть перебираем, при этом будут получены строки из потока. Строки определяются немного по-разному в зависимости от того, является ли поток двоичным потоком (возвращаютсяbytes) или текстовым потоком (возвращаются строкиunicode). См.readline()ниже.IOBase также является менеджером контекста и поэтому поддерживает оператор
with. В данном примере file закрывается после завершения блока оператораwith, даже если произойдёт исключение:with io.open('spam.txt', 'w') as file: file.write(u'Spam and eggs!')IOBaseпредоставляет эти данные и методы:-
close() -
Очистить и закрыть этот поток. Этот метод не оказывает никакого действия, если файл уже закрыт. После закрытия файла любая операция с файлом (например, чтение или запись) вызовет
ValueError.Для удобства разрешается вызывать этот метод более одного раза; однако только первый вызов окажет действие.
-
closed -
True, если поток закрыт.
-
fileno() -
Возвращает дескриптор базового файла (целое число) потока, если он существует. Если объект IO не использует дескриптор файла, возникает
IOError.
-
flush() -
Очищает буферы записи потока, если применимо. Для потоков только для чтения и для потоков без блокировки это ничего не делает.
-
isatty() -
Возвращает
True, если поток интерактивный (т. е. подключен к терминалу/устройству tty).
-
readable() -
Возвращает
True, если из потока можно читать. ЕслиFalse,read()вызоветIOError.
-
readline(limit=-1) -
Считывает и возвращает одну строку из потока. Если указан limit, будет считано не более limit байтов.
Разделитель строк всегда
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 обычно отрицательный
Возвращает новую абсолютную позицию.
Добавлено в версии 2.7: Константы
SEEK_* -
-
seekable() -
Возвращает
True, если поток поддерживает произвольный доступ. ЕслиFalse,seek(),tell()иtruncate()вызовутIOError.
-
tell() -
Возвращает текущую позицию потока.
-
truncate(size=None) -
Изменяет размер потока на указанный размер в байтах (или текущую позицию, если size не указан). Текущая позиция потока не меняется. Это изменение размера может расширить или уменьшить текущий размер файла. В случае расширения содержимое новой области файла зависит от платформы (на большинстве систем дополнительные байты заполняются нулями, в Windows они неопределённы). Возвращается новый размер файла.
-
writable() -
Возвращает
True, если поток поддерживает запись. ЕслиFalse,write()иtruncate()вызовутIOError.
-
writelines(lines) -
Записывает список строк в поток. Разделители строк не добавляются, поэтому для каждой предоставленной строки обычно используется разделитель строк в конце.
-
-
class io.RawIOBase -
Базовый класс для операций ввода-вывода ссылок на двоичные данные. Он наследует
IOBase. Публичного конструктора нет.Непосредственный двоичный ввод-вывод обычно обеспечивает доступ к базовому устройству или API операционной системы на низком уровне и не пытается упаковать его в высокоуровневые примитивы (это остается буферизованному вводу-выводу и текстовому вводу-выводу, описанным позже на этой странице).
В дополнение к атрибутам и методам из
IOBase, RawIOBase предоставляет следующие методы:-
read(n=-1) -
Прочитать до n байт из объекта и вернуть их. Для удобства, если n не указано или равно -1, вызывается
readall(). В противном случае выполняется только один системный вызов. Может быть возвращено меньше, чем n байт, если системный вызов вернул меньше, чем n байт.Если возвращено 0 байт, а n не было равно 0, это указывает на конец файла. Если объект находится в режиме без блокировки и байты недоступны, возвращается
None.
-
readall() -
Прочитать и вернуть все байты из потока до EOF, используя несколько вызовов потока, если необходимо.
-
readinto(b) -
Прочитать до len(b) байт в b и вернуть количество прочитанных байт. Объект b должен быть предварительно выделенным, записываемым массивом байтов, либо
bytearray, либоmemoryview. Если объект находится в режиме без блокировки и байты недоступны, возвращаетсяNone.
-
write(b) -
Записать b в базовый поток сырых данных и вернуть количество записанных байт. Объект b должен быть массивом байтов, либо
bytes,bytearray, либоmemoryview. Возвращаемое значение может быть меньшеlen(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.Добавлена в версии 2.7.
-
read(n=-1) -
Прочитать и вернуть до n байт. Если аргумент опущен,
None, или отрицателен, данные читаются и возвращаются до тех пор, пока не будет достигнут EOF. Если поток уже находится в состоянии EOF, возвращается пустой байтовый объект.Если аргумент положительный, и базовый поток сырых данных не интерактивный, могут быть выполнены несколько операций чтения сырых данных для удовлетворения количества байтов (если раньше не был достигнут EOF). Но для интерактивных потоков сырых данных будет выполнена не более одной операции чтения сырых данных, и короткий результат не означает, что EOF близок.
Исключение
BlockingIOErrorвозникает, если базовый поток сырых данных находится в режиме без блокировки и в данный момент нет доступных данных.
-
read1(n=-1) -
Прочитать и вернуть до n байт, выполнив не более одного вызова метода
read()базового потока сырых данных. Это может быть полезно, если вы реализуете собственный буферизацию поверх объектаBufferedIOBase.
-
readinto(b) -
Прочитать до len(b) байт в b и вернуть количество прочитанных байт. Объект b должен быть предварительно выделенным, записываемым массивом байтов, либо
bytearray, либоmemoryview.Как и в методе
read(), могут быть выполнены несколько операций чтения базового потока сырых данных, за исключением случаев, когда он «интерактивный».Исключение
BlockingIOErrorвозникает, если базовый поток сырых данных находится в режиме без блокировки и в данный момент нет доступных данных.
-
write(b) -
Записать b и вернуть количество записанных байт (всегда равное
len(b), так как при неудачной записи будет возбуждено исключениеIOError). Объект b должен быть массивом байтов, либоbytes,bytearray, либоmemoryview. В зависимости от фактической реализации, эти байты могут быть сразу записаны в базовый поток или храниться в буфере по причинам производительности и задержек.В режиме без блокировки возникает исключение
BlockingIOError, если данные, которые нужно было записать в поток сырых данных, не могли быть приняты без блокировки.Вызывающая сторона может освободить или изменить b после возврата этого метода, поэтому реализация должна обращаться к b только во время вызова метода.
-
3. Ввод-вывод ссылок на сырые файлы
-
class io.FileIO(name, mode='r', closefd=True) -
FileIOпредставляет собой файл на уровне операционной системы, содержащий данные в байтах. Он реализует интерфейсRawIOBase(и, следовательно, интерфейсIOBase).Имя может быть одним из двух:
- строка, представляющая путь к файлу, который будет открыт;
- целое число, представляющее номер существующего дескриптора файла на уровне операционной системы, к которому получившийся объект
FileIOпредоставит доступ.
Режим может быть
'r','w'или'a'для чтения (по умолчанию), записи или добавления. Файл будет создан, если он не существует при открытии для записи или добавления; он будет обнулен при открытии для записи. Добавьте'+'в режим, чтобы разрешить одновременное чтение и запись.Методы
read()(при вызове с положительным аргументом),readinto()иwrite()в этом классе будут выполнять только один системный вызов.Помимо атрибутов и методов из
IOBaseиRawIOBase,FileIOпредоставляет следующие атрибуты данных и методы:-
mode -
Режим, заданный в конструкторе.
-
name -
Имя файла. Это дескриптор файла, когда имя не задано в конструкторе.
4. Буферизованные потоки
Буферизованные потоки ввода-вывода предоставляют более высокий уровень интерфейса к устройству ввода-вывода, чем потоки необработанного ввода-вывода.
-
class io.BytesIO([initial_bytes]) -
Реализация потока, использующая буфер байтов в памяти. Наследует
BufferedIOBase.Необязательный аргумент initial_bytes — это объект
bytes, содержащий начальные данные.BytesIOпредоставляет или переопределяет эти методы в дополнение к методам изBufferedIOBaseиIOBase:-
getvalue() -
Возвращает
bytes, содержащий всё содержимое буфера.
-
read1() -
В
BytesIOэто то же, что иread().
-
-
class io.BufferedReader(raw, buffer_size=DEFAULT_BUFFER_SIZE) -
Буфер, обеспечивающий доступ на более высоком уровне к читаемому, последовательному объекту
RawIOBase. Он наследуетBufferedIOBase. При чтении данных из этого объекта может быть запрошено большее количество данных из базового потока необработанного ввода-вывода и сохранено во внутреннем буфере. Буферизованные данные затем могут быть возвращены непосредственно при последующих операциях чтения.Конструктор создаёт
BufferedReaderдля заданного читаемого потока raw и buffer_size. Если buffer_size опущено, используетсяDEFAULT_BUFFER_SIZE.BufferedReaderпредоставляет или переопределяет следующие методы в дополнение к методам изBufferedIOBaseиIOBase:-
peek([n]) -
Возвращает байты из потока без изменения позиции. Для удовлетворения вызова выполняется не более одного единственного чтения из потока необработанного ввода-вывода. Количество возвращённых байтов может быть меньше или больше запрошенного.
-
read([n]) -
Считывает и возвращает n байтов, или если n не задано или отрицательно, до конца файла или если вызов чтения заблокируется в режиме без блокировки.
-
read1(n) -
Считывает и возвращает до n байтов с помощью одного вызова на потоке необработанного ввода-вывода. Если хотя бы один байт буферизован, возвращаются только буферизованные байты. В противном случае выполняется один вызов чтения потока необработанного ввода-вывода.
-
-
class io.BufferedWriter(raw, buffer_size=DEFAULT_BUFFER_SIZE) -
Буфер, обеспечивающий доступ на более высоком уровне к записываемому, последовательному объекту
RawIOBase. Он наследуетBufferedIOBase. При записи в этот объект данные обычно хранятся во внутреннем буфере. Буфер записывается в базовый объектRawIOBaseв различных условиях, в том числе:- когда буфер становится слишком маленьким для всех ожидающих данных;
- когда вызывается
flush(); - когда запрашивается
seek()(для объектовBufferedRandom); - когда объект
BufferedWriterзакрывается или уничтожается.
Конструктор создаёт
BufferedWriterдля заданного записываемого потока raw. Если buffer_size не задано, оно по умолчанию равноDEFAULT_BUFFER_SIZE.Третий аргумент max_buffer_size поддерживается, но не используется и устарел.
BufferedWriterпредоставляет или переопределяет следующие методы в дополнение к методам изBufferedIOBaseиIOBase:-
flush() -
Принудительно помещает байты, находящиеся в буфере, в поток необработанного ввода-вывода. При блокировке потока необработанного ввода-вывода должно быть возбуждено исключение
BlockingIOError.
-
write(b) -
Записывает b и возвращает количество записанных байтов. Объект b должен быть массивом байтов, либо
bytes,bytearray, илиmemoryview. В режиме без блокировки, если буфер нужно записать, но поток необработанного ввода-вывода блокируется, возбуждается исключениеBlockingIOError.
-
class io.BufferedRandom(raw, buffer_size=DEFAULT_BUFFER_SIZE) -
Буферизованный интерфейс для потоков с произвольным доступом. Наследует
BufferedReaderиBufferedWriterи дополнительно поддерживает функциональностьseek()иtell().Конструктор создаёт чтение и запись для потока с произвольным доступом, заданного в первом аргументе. Если buffer_size опущено, оно по умолчанию равно
DEFAULT_BUFFER_SIZE.Третий аргумент, max_buffer_size, поддерживается, но не используется и устарел.
BufferedRandomможет делать всё, что можетBufferedReaderилиBufferedWriter.
-
class io.BufferedRWPair(reader, writer, buffer_size=DEFAULT_BUFFER_SIZE) -
Буферизованный объект ввода-вывода, объединяющий два однонаправленных объекта
RawIOBase– один для чтения, другой для записи – в одно двунаправленное конечное устройство. Он наследует отBufferedIOBase.reader и writer являются объектами
RawIOBase, предназначенными для чтения и записи соответственно. Если параметр buffer_size опущен, он принимает значение по умолчаниюDEFAULT_BUFFER_SIZE.Четвёртый аргумент, max_buffer_size, поддерживается, но не используется и устарел.
BufferedRWPairреализует все методыBufferedIOBase, за исключениемdetach(), который вызывает исключениеUnsupportedOperation.Предупреждение
BufferedRWPairне пытается синхронизировать доступ к его базовым потокам. Не следует передавать ему один и тот же объект для reader и writer; используйтеBufferedRandomвместо этого.
5. Ввод-вывод текста
-
class io.TextIOBase -
Базовый класс для текстовых потоков. Этот класс предоставляет интерфейс для ввода-вывода потоков на основе символов и строк Юникода. Метод
readinto()отсутствует, так как строки Pythonunicodeнеизменяемы. Он наследует отIOBase. Публичного конструктора нет.TextIOBaseпредоставляет или переопределяет эти данные атрибуты и методы в дополнение к тем, которые находятся вIOBase:-
encoding -
Имя кодировки, используемой для декодирования байтов потока в строки и кодирования строк в байты.
-
errors -
Настройка обработки ошибок декодера или кодера.
-
newlines -
Строка, кортеж строк или
None, указывающие на обработанные до сих пор символы новой строки. В зависимости от реализации и флагов конструктора это может быть недоступно.
-
buffer -
Базовый двоичный буфер (экземпляр
BufferedIOBase), с которым работаетTextIOBase. Это не часть APITextIOBaseи может отсутствовать в некоторых реализациях.
-
detach() -
Отделить базовый двоичный буфер от
TextIOBaseи вернуть его.После отделения базового буфера,
TextIOBaseстановится непригодным для использования.В некоторых реализациях
TextIOBase, таких какStringIO, концепции базового буфера нет, и вызов этого метода вызовет исключениеUnsupportedOperation.Введено в версии 2.7.
-
read(n=-1) -
Прочитать и вернуть не более n символов из потока как одиночную строку
unicode. Если n отрицательно илиNone, читает до конца потока.
-
readline(limit=-1) -
Считывает до символа новой строки или конца потока и возвращает строку
unicode. Если поток уже достиг конца, возвращается пустая строка.Если указано limit, будет прочитано не более limit символов.
-
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 должен быть нулём (все остальные значения не поддерживаются).
Возвращает новую абсолютную позицию в виде числового значения.
Введено в версии 2.7: Константы
SEEK_*. -
-
tell() -
Возвращает текущую позицию потока в виде числового значения. Число обычно не представляет количество байтов в базовом двоичном хранилище.
-
write(s) -
Записать строку
unicodes в поток и вернуть количество записанных символов.
-
-
class io.TextIOWrapper(buffer, encoding=None, errors=None, newline=None, line_buffering=False) -
Буферизованный текстовый поток над двоичным потоком
BufferedIOBase. Он наследует отTextIOBase.encoding задаёт имя кодировки, с которой поток будет декодирован или закодирован. По умолчанию используется
locale.getpreferredencoding().errors — необязательная строка, которая указывает, как обрабатываются ошибки кодирования и декодирования. Передайте
'strict'для повышения исключенияValueErrorв случае ошибки кодирования (значение по умолчаниюNoneимеет тот же эффект), или передайте'ignore'для игнорирования ошибок. (Обратите внимание, что игнорирование ошибок кодирования может привести к потере данных.)'replace'вызывает вставку маркера замены (например,'?') там, где имеются некорректные данные. При записи можно использовать'xmlcharrefreplace'(замените соответствующим XML-символом) или'backslashreplace'(замените обрамлёнными в обратные слеши последовательностями escape). Любое другое имя обработки ошибок, зарегистрированное с помощьюcodecs.register_error(), также допустимо.newline управляет тем, как обрабатываются окончания строк. Он может принимать значения
None,'','\n','\r', и'\r\n'. Его действие следующее:- При вводе, если newline –
None, включён режим универсальных новых строк. Строки на входе могут заканчиваться'\n','\r', или'\r\n', и они переводятся в'\n'перед возвращением вызывающей программе. Если это'', режим универсальных новых строк включен, но окончания строк возвращаются вызывающей программе без перевода. Если это любое другое допустимое значение, строки ввода заканчиваются только указанной строкой, и окончание строки возвращается вызывающей программе без перевода. - При выводе, если newline –
None, любые символы'\n', которые были написаны, переводятся в системный разделитель строк по умолчаниюos.linesep. Если newline –'', никакого перевода не происходит. Если newline имеет любое другое допустимое значение, любые символы'\n', которые были написаны, переводятся в указанную строку.
Если line_buffering –
True, подразумеваетсяflush(), когда вызов write содержит символ новой строки или возврат каретки.TextIOWrapperпредоставляет один атрибут в дополнение к тем, что имеются уTextIOBaseи его родительских классов:-
line_buffering -
Включена ли буферизация строк.
- При вводе, если newline –
-
class io.StringIO(initial_value=u'', newline=u'\n') -
Поток в оперативной памяти для текстовых данных Unicode. Он наследует
TextIOWrapper.Начальное значение буфера можно установить, указав initial_value. Если включена обработка символов перевода строки, переводы строк будут закодированы так же, как и с помощью
write(). Поток позиционируется в начале буфера.Аргумент newline работает так же, как и в
TextIOWrapper. По умолчанию учитываются только символы\nв качестве концов строк и не выполняется перевод строк. Если newline задано какNone, переводы строк записываются как\nна всех платформах, но все равно выполняется универсальное декодирование перевода строк при чтении.StringIOпредоставляет этот метод в дополнение к методамTextIOWrapperи его родительских классов:-
getvalue() -
Возвращает
unicode, содержащий все содержимое буфера в любой момент до того, как методclose()объектаStringIOбудет вызван. Переводы строк декодируются так же, как и с помощьюread(), хотя положение потока не изменяется.
Пример использования:
import io output = io.StringIO() output.write(u'First line.\n') output.write(u'Second line.\n') # Retrieve file contents -- this will be # u'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.
6. Дополнительные темы
Здесь мы обсудим несколько дополнительных тем, относящихся к конкретным реализациям ввода-вывода, описанным выше.
6.1. Производительность
6.1.1. Двоичный ввод-вывод
При чтении и записи только больших блоков данных, даже когда пользователь запрашивает один байт, буферизованный ввод-вывод предназначен для скрытия любой неэффективности при вызове и выполнении системных функций небуферизованного ввода-вывода. Выигрыш будет сильно варьироваться в зависимости от ОС и типа выполняемого ввода-вывода (например, на некоторых современных ОС, таких как Linux, небуферизованный ввод-вывод на диск может быть таким же быстрым, как и буферизованный). Однако суть в том, что буферизованный ввод-вывод обеспечит предсказуемую производительность независимо от платформы и устройства. Поэтому предпочтительнее использовать буферизованный ввод-вывод, а не небуферизованный.
6.1.2. Текстовый ввод-вывод
Текстовый ввод-вывод над двоичным хранилищем (например, файл) значительно медленнее двоичного ввода-вывода над тем же хранилищем, потому что это подразумевает преобразования из Unicode в двоичные данные с использованием кодека символов. Это может стать заметным, если вы обрабатываете огромные объемы текстовых данных (например, очень большие файлы журналов). Также TextIOWrapper.tell() и TextIOWrapper.seek() очень медленные из-за алгоритма реконструции, используемого.
StringIO, однако, является собственной контейнером Unicode в оперативной памяти и будет демонстрировать скорость, аналогичную BytesIO.
6.2. Многопоточность
FileIO объекты потокобезопасны в той мере, в какой системные вызовы (например, read(2) под Unix), которые они оборачивают, являются потокобезопасными.
Двоичные буферизованные объекты (экземпляры BufferedReader, BufferedWriter, BufferedRandom и BufferedRWPair) защищают свои внутренние структуры с помощью блокировки; поэтому их можно вызывать из нескольких потоков одновременно.
TextIOWrapper объекты не потокобезопасны.
6.3. Реентерабельность
Двоичные буферизованные объекты (экземпляры BufferedReader, BufferedWriter, BufferedRandom и BufferedRWPair) не реентерабельны. Хотя реентерабельные вызовы не будут происходить в нормальных ситуациях, они могут возникнуть, если вы выполняете ввод-вывод в обработчике signal. Если попытка повторного входа в буферизованный объект происходит, когда он уже используется из того же потока, то возникает RuntimeError.
Вышеизложенное подразумевает расширение до текстовых файлов, так как функция open() будет оборачивать буферизованный объект в TextIOWrapper. Это включает стандартные потоки и, следовательно, влияет на встроенную функцию print() также.
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/2.7/library/io.html