Python textiowrapper io что это
io — Основные инструменты для работы с потоками¶
Исходный код: Lib/io.py
Обзор¶
Независимо от своей категории, у каждого конкретного объекта потока также будут различные возможности: он может быть доступен только для чтения, только для записи или чтения-записи. Он также может разрешать произвольный произвольный доступ (поиск вперед или назад в любое место) или только последовательный доступ (например, в случае сокета или канала (pipe)).
Текстовый ввод/вывод¶
Текстовые потоки в памяти также доступны как объекты StringIO :
Двоичный ввод/вывод¶
Двоичный ввод-вывод (также называемый буферизованный I/O) ожидает байтовые объекты и производит bytes объекты. Кодирование, декодирование или перевод новой строки не выполняется. Данная категория потоков может использоваться для всех видов нетекстовых данных, а также когда требуется ручное управление обработкой текстовых данных.
Самый простой способ создать двоичный поток — использовать open() с ‘b’ в строке режима:
Двоичные потоки в памяти также доступны как объекты BytesIO :
Необработанный ввод-вывод¶
Необработанный ввод-вывод (также называемый небуферизованный I/O) обычно используется в качестве низкоуровневого строительного блока для двоичных и текстовых потоков; редко бывает полезно напрямую управлять необработанным потоком из пользовательского кода. Тем не менее, вы можете создать необработанный поток, открыв файл в двоичном режиме с отключенной буферизацией:
Интерфейс модуля высокого уровня¶
Тип int, содержащий размер буфера по умолчанию, используемый классами буферизованного ввода-вывода модуля. open() использует размер файла blksize (полученный os.stat() ), если это возможно.
io. open_code ( path ) ¶
path должен быть str и абсолютным путём.
Добавлено в версии 3.8.
exception io. UnsupportedOperation ¶
Потоки в памяти¶
Также можно использовать str или байтовый объект в качестве файла как для чтения, так и для записи. Для строк StringIO может использоваться как файл, открытый в текстовом режиме. BytesIO можно использовать как файл, открытый в двоичном режиме. Оба предоставляют полные возможности чтения-записи с произвольным доступом.
Иерархия классов¶
Реализация потоков ввода-вывода организована в виде иерархии классов. Сначала абстрактные базовые классы (ABC), которые используются для определения различных категорий потоков, затем конкретные классы, обеспечивающие стандартные реализации потоков.
Имена аргументов не являются частью спецификации, и только аргументы open() предназначены для использования в качестве ключевых аргументов.
В следующей таблице приведены ABC, предоставляемые модулем io :
Базовые классы ввода-вывода¶
Абстрактный базовый класс для всех классов ввода-вывода, воздействующий на потоки байтов. Общедоступного конструктора нет.
Класс предоставляет пустые абстрактные реализации для многих методов, которые производные классы могут выборочно переопределять; реализации по умолчанию представляют собой файл, который нельзя прочитать, записать или найти.
IOBase (и его подклассы) поддерживает протокол итератора, что означает, что объект IOBase может быть повторен, отдавая строки в потоке. Строки определяются немного по-разному в зависимости от того, является ли поток двоичным потоком (дающим байты) или текстовым потоком (дающим символьные строки). См. readline() ниже.
IOBase предоставляет следующие атрибуты данных и методы:
Для удобства можно вызывать данный метод более одного раза; однако только первый вызов будет приводить к эффекту.
Если возможно, очистите буферы записи потока. Ничего не делает для потоков, предназначенных только для чтения и неблокирующих потоков.
Прочитать и вернуть одну строку из потока. Если указан size, будет прочитано не более size байтов.
Для двоичных файлов терминатор строки всегда b’\n’ ; для текстовых файлов аргумент newline для open() может использоваться для выбора распознаваемых ограничителей строки.
Прочитать и вернуть список строк из потока. hint можно указать для управления количеством прочитанных строк: больше не будут считываться строки, если общий размер (в байтах/символах) всех строк на данный момент превышает hint.
seek ( offset, whence=SEEK_SET ) ¶
Возвращает новую абсолютную позицию.
Возвращает текущую позицию потока.
Изменить размер потока до заданного size в байтах (или текущей позиции, если size не указан). Текущая позиция в потоке не изменяется. Изменение размера может увеличить или уменьшить текущий размер файла. В случае расширения содержимое новой файловой области зависит от платформы (в большинстве систем дополнительные байты заполняются нулями). Возвращается новый размер файла.
Изменено в версии 3.5: Windows теперь будет заполнять файлы нулями при расширении.
Записать список строк в поток. Разделители строк не добавляются, поэтому обычно у каждой из предоставленных строк есть разделитель строк в конце.
class io. RawIOBase ¶
Необработанный двоичный ввод-вывод обычно предоставляет низкоуровневый доступ к базовому устройству ОС или API и не пытается инкапсулировать его в высокоуровневые примитивы (оставлено для буферизованного ввода-вывода и текстового ввода-вывода, описанного ниже на этой странице).
Прочитать и вернуть все байты из потока до EOF, используя при необходимости несколько вызовов потока.
class io. BufferedIOBase ¶
BufferedIOBase предоставляет или переопределяет данные методы и атрибуты в дополнение к тем из IOBase :
Отделить базовый необработанный поток от буфера и вернуть его.
После отсоединения необработанного потока буфер находится в непригодном для использования состоянии.
Добавлено в версии 3.1.
Чтение и возвращение до size байт. Если аргумент пропущен, None или отрицательный, данные считываются и возвращаются до достижения EOF. Пустой объект bytes возвращается, если поток уже находится в EOF.
Если аргумент положительный, а базовый необработанный поток не является интерактивным, может быть выполнено несколько необработанных чтений, чтобы удовлетворить счетчику байтов (если EOF не будет достигнут первым). Но для интерактивных необработанных потоков будет выполнено не более одного необработанного чтения, и короткий результат не означает, что EOF неизбежен.
BlockingIOError возникает, если базовый необработанный поток находится в неблокирующем режиме и в настоящий момент нет доступных данных.
BlockingIOError возникает, если базовый необработанный поток находится в неблокирующем режиме и в данный момент нет доступных данных.
Прочитать байты в предварительно выделенный, доступный для записи байтового объекта b, используя не более одного вызова метода read() (или readinto() ) базового необработанного потока. Возвращает количество прочитанных байтов.
BlockingIOError возникает, если базовый необработанный поток находится в неблокирующем режиме и в настоящий момент нет доступных данных.
Добавлено в версии 3.5.
Вызывающий может освободить или изменить b после возврата из этого метода, поэтому реализация должна обращаться к b только во время вызова метода.
Ввод-вывод необработанных файлов¶
FileIO представляет собой файл уровня ОС, содержащий данные в байтах. Он реализует интерфейс RawIOBase (и, следовательно, интерфейс IOBase ).
name может быть одним из двух:
Методы read() (при вызове с положительным аргументом), readinto() и write() этого класса будут выполнять только один системный вызов.
Можно использовать настраиваемый открыватель, передав вызываемый объект как opener. Базовый файловый дескриптор для файлового объекта получается путём вызова opener с (name, flags). opener должен возвращать дескриптор открытого файла (передача os.open как opener приводит к функциональности, аналогичной передаче None ).
См. встроенную функцию open() для примеров использования параметра opener.
Изменено в версии 3.4: Теперь файл не наследуется.
Режим, указанный в конструкторе.
Имя файла. Файловый дескриптор файла, если в конструкторе не указано имя.
Буферизованные потоки¶
Буферизованные потоки ввода-вывода предоставляют интерфейс более высокого уровня для устройства ввода-вывода, чем необработанный ввод-вывод.
class io. BytesIO ( [ initial_bytes ] ) ¶
BytesIO предоставляет или отменяет данные методы в дополнение к методам из BufferedIOBase и IOBase :
Возвращает доступное для чтения и записи представление содержимого буфера без его копирования. Кроме того, изменение представления прозрачно обновит содержимое буфера:
Добавлено в версии 3.2.
Изменено в версии 3.7: Аргумент size теперь необязателен.
Добавлено в версии 3.5.
BufferedReader предоставляет или отменяет эти методы в дополнение к методам из BufferedIOBase и IOBase :
Возврат байтов из потока без продвижения позиции. Для удовлетворения запроса выполняется не более одного однократного чтения необработанного потока. Количество возвращенных байтов может быть меньше или больше запрошенного.
Прочитать и вернуть size байтов, или, если size не задано или отрицательно, до EOF или если вызов чтения блокируется в неблокирующем режиме.
Чтение и возврат до size байтов только с одним вызовом необработанного потока. Если в буфере находится хотя бы один байт, возвращаются только буферизованные байты. В противном случае выполняется один вызов чтения необработанного потока.
Изменено в версии 3.7: Аргумент size теперь необязателен.
BufferedWriter предоставляет или отменяет данные методы в дополнение к методам из BufferedIOBase и IOBase :
class io. BufferedRandom ( raw, buffer_size=DEFAULT_BUFFER_SIZE ) ¶
class io. BufferedRWPair ( reader, writer, buffer_size=DEFAULT_BUFFER_SIZE ) ¶
Текстовый ввод/вывод¶
TextIOBase предоставляет или отменяет эти атрибуты данных и методы в дополнение к атрибутам из IOBase :
Имя кодировки, используемой для декодирования байтов потока в строки и для кодирования строк в байты.
Ошибка настройки декодера или кодировщика.
Отделить нижележащий двоичный буфер от TextIOBase и вернуть его.
После отсоединения нижележащего буфера TextIOBase находится в непригодном для использования состоянии.
Добавлено в версии 3.1.
Если указан size, будет прочитано не более size символов.
seek ( offset, whence=SEEK_SET ) ¶
Возвращает новую абсолютную позицию как непрозрачное число.
Возвращает текущую позицию в потоке как непрозрачное число. Число обычно не представляет собой количество байтов в базовом двоичном хранилище.
Записать в поток строку s и вернуть количество записанных символов.
class io. TextIOWrapper ( buffer, encoding=None, errors=None, newline=None, line_buffering=False, write_through=False ) ¶
Изменено в версии 3.3: Добавлен аргумент write_through.
TextIOWrapper предоставляет ряд атрибутов в дополнение к атрибутам TextIOBase и его родителям:
Включена ли буферизация строки.
Передаются ли записи немедленно в базовый двоичный буфер.
Добавлено в версии 3.7.
Изменить конфигурацию текстового потока, используя новые настройки для encoding, errors, newline, line_buffering и write_through.
Невозможно изменить кодировку или новую строку, если некоторые данные уже были прочитаны из потока. С другой стороны, изменение кодировки после записи возможно.
Метод выполняет неявную очистку потока перед установкой новых параметров.
Добавлено в версии 3.7.
StringIO предоставляет следующий метод в дополнение к методам из TextIOBase и его родителей:
Производительность¶
В этом разделе обсуждается производительность предоставленных конкретных реализаций ввода-вывода.
Двоичный ввод/вывод¶
За счёт чтения и записи только больших блоков данных, даже когда пользователь запрашивает один байт, буферизованный ввод-вывод скрывает любую неэффективность при вызове и выполнении небуферизованных процедур ввода-вывода операционной системы. Прирост зависит от ОС и типа выполняемого ввода-вывода. Например, в некоторых современных ОС, таких как Linux, небуферизованный дисковый ввод-вывод может быть таким же быстрым, как и буферизованный ввод-вывод. Суть в том, что буферизованный ввод-вывод обеспечивает предсказуемую производительность независимо от платформы и устройства поддержки. Следовательно, почти всегда предпочтительнее использовать буферизованный ввод-вывод, а не небуферизованный ввод-вывод для двоичных данных.
Текстовый ввод/вывод¶
Текстовый ввод-вывод в двоичном хранилище (таком как файл) значительно медленнее, чем двоичный ввод-вывод в том же хранилище, потому что он требует преобразования между Юникодом и двоичными данными с использованием символьного кодека. Может стать заметным при обработке огромных объёмов текстовых данных, таких как большие файлы журналов. Кроме того, TextIOWrapper.tell() и TextIOWrapper.seek() работают довольно медленно из-за используемого алгоритма восстановления.
Многопоточность¶
Объекты FileIO являются потокобезопасными в той степени, в которой вызовы операционной системы (например, read(2) в Unix), которые их обёртывают, также являются потокобезопасными.
Объекты TextIOWrapper не являются потокобезопасными.
Реентерабельность¶
Работа с файлами – ввод-вывод данных в Python
Иногда недостаточно просто отображать данные на консоли. Данные могут быть очень большими, и только ограниченный объем данных может отображаться на консоли, поскольку память является энергозависимой, невозможно восстановить сгенерированные программой данные снова и снова.
Обработка файлов играет важную роль, когда данные необходимо постоянно хранить в файле. Файл – это указанное место на диске для хранения связанной информации. Мы можем получить доступ к сохраненной информации (энергонезависимой) после завершения программы.
Реализация обработки файлов немного длиннее и сложнее в других языках программирования, но в Python она проще и короче.
В Python файлы обрабатываются в двух режимах как текстовые или двоичные. Файл может быть в текстовом или двоичном формате, и каждая строка файла заканчивается специальным символом. Следовательно, файловая операция может выполняться в следующем порядке:
Открытие файла
Python предоставляет функцию open(), которая принимает два аргумента: имя файла и режим доступа, в котором осуществляется доступ к файлу. Функция возвращает файловый объект, который можно использовать для выполнения различных операций, таких как чтение, запись и т. д.
Доступ к файлам можно получить с помощью различных режимов, таких как чтение, запись или добавление. Ниже приведены подробные сведения о режимах доступа для открытия файла.
Режим доступа | Описание | |
---|---|---|
1 | r | Он открывает файл в режиме только для чтения. Указатель файла существует в начале. Файл по умолчанию открывается в этом режиме, если не передан режим доступа. |
2 | rb | Открывает файл в двоичном формате только для чтения. Указатель файла существует в начале файла. |
3 | г + | Открывает для чтения и записи. Указатель файла также существует в начале. |
4 | rb + | в двоичном формате. Указатель файла присутствует в начале файла. |
5 | w | Только для записи. Он перезаписывает файл, если он существовал ранее, или создает новый, если файл с таким именем не существует. Указатель имеется в начале файла. |
6 | wb | Открывает файл для записи только в двоичном формате. Перезаписывает файл, если он существует ранее, или создает новый, если файл не существует. Указатель файла существует в начале файла. |
7 | w + | Для записи и чтения обоих. Он отличается от r + в том смысле, что он перезаписывает предыдущий файл, если он существует, тогда как r + не перезаписывает ранее записанный файл. Он создает новый файл, если файл не существует. Указатель файла существует в начале файла. |
8 | wb + | Он открывает файл для записи и чтения в двоичном формате. Указатель файла существует в начале файла. |
9 | а | В режиме добавления. Указатель файла существует в конце ранее записанного файла, если он существует. Он создает новый файл, если не существует файла с таким же именем. |
10 | ab | В режиме добавления в двоичном формате. Указатель существует в конце ранее записанного файла. Он создает новый файл в двоичном формате, если не существует файла с таким же именем. |
11 | а + | Он открывает файл для добавления и чтения. Указатель файла остается в конце файла, если файл существует. Он создает новый файл, если не существует файла с таким же именем. |
12 | ab + | Открывает файл для добавления и чтения в двоичном формате. Указатель файла остается в конце файла. |
Давайте посмотрим на простой пример, чтобы открыть файл с именем «file.txt»(хранящийся в том же каталоге) в режиме чтения и распечатать его содержимое на консоли.
В приведенном выше коде мы передали filename в качестве первого аргумента и открыли файл в режиме чтения, поскольку мы упомянули r в качестве второго аргумента. Fileptr содержит объект файла, и если файл открывается успешно, он выполнит оператор печати.
Метод close()
После того, как все операции будут выполнены с файлом, мы должны закрыть его с помощью нашего скрипта Python, используя метод close(). Любая незаписанная информация уничтожается после вызова метода close() для файлового объекта.
Мы можем выполнить любую операцию с файлом извне, используя файловую систему, которая в данный момент открыта в Python; поэтому рекомендуется закрыть файл после выполнения всех операций.
Синтаксис использования метода close() приведен ниже.
Рассмотрим следующий пример.
После закрытия файла мы не можем выполнять какие-либо операции с файлом. Файл необходимо правильно закрыть. Если при выполнении некоторых операций с файлом возникает какое-либо исключение, программа завершается, не закрывая файл.
Мы должны использовать следующий метод, чтобы решить такую проблему.
Оператор with
Оператор with был введен в Python 2.5. Он полезен в случае манипулирования файлами. Используется в сценарии, когда пара операторов должна выполняться с блоком кода между ними.
Синтаксис для открытия файла с помощью оператора приведен ниже.
Преимущество использования оператора with заключается в том, что он обеспечивает гарантию закрытия файла независимо от того, как закрывается вложенный блок.
Рассмотрим следующий пример.
Запись файла
Чтобы записать текст в файл, нам нужно открыть файл с помощью метода open с одним из следующих режимов доступа.
Скриншот файла file2.txt
Мы открыли файл в режиме w. Файл file1.txt не существует, он создал новый файл, и мы записали его содержимое с помощью функции write().
Снимок файла file2.txt
Мы видим, что содержимое файла изменено. Мы открыли файл в режиме и добавили содержимое в существующий файл file2.txt.
Чтобы прочитать файл с помощью сценария Python, Python предоставляет метод read(). Метод read() считывает строку из файла. Он может читать данные как в текстовом, так и в двоичном формате.
Синтаксис метода read() приведен ниже.
Здесь счетчик – это количество байтов, которые должны быть прочитаны из файла, начиная с его начала. Если счетчик не указан, он может читать содержимое файла до конца.
Рассмотрим следующий пример.
В приведенном выше коде мы прочитали содержимое file2.txt с помощью функции read(). Мы передали значение счетчика как десять, что означает, что он будет читать первые десять символов из файла.
Если мы используем следующую строку, она распечатает все содержимое файла.
Чтение файл для цикла
Мы можем прочитать файл, используя цикл for. Рассмотрим следующий пример.
Чтение файла построчно
Python упрощает чтение файла построчно с помощью метода readline(). Метод readline() читает строки файла с самого начала, т. е. если мы используем его два раза, мы можем получить первые две строки файла.
Рассмотрим следующий пример, который содержит функцию readline(), которая читает первую строку нашего файла «file2.txt», содержащую три строки.
Пример 1: чтение строк с помощью функции readline()
Мы вызывали функцию readline() два раза, поэтому она считывает две строки из файла.
Python также предоставляет метод readlines(), который используется для чтения строк. Возвращает список строк до конца файла(EOF).
Пример 2: чтение строк с помощью функции readlines()
Создание нового файла
Новый файл можно создать, используя один из следующих режимов доступа с функцией open().
Позиции указателя файла
Python предоставляет метод tell(), который используется для печати номера байта, в котором в настоящее время существует указатель файла. Рассмотрим следующий пример.
Изменение позиции указателя файла
В реальных приложениях иногда нам нужно изменить расположение указателя файла извне, поскольку нам может потребоваться прочитать или записать контент в разных местах.
Для этой цели Python предоставляет нам метод seek(), который позволяет нам изменять положение указателя файла извне.
Синтаксис для использования метода seek():
Метод seek() принимает два параметра:
Рассмотрим следующий пример.
Модуль OS Python
Переименование файла
Модуль Python os обеспечивает взаимодействие с операционной системой. Модуль os предоставляет функции, которые участвуют в операциях обработки файлов, таких как переименование, удаление и т. д. Он предоставляет нам метод rename() для переименования указанного файла в новое имя. Синтаксис для использования метода rename() приведен ниже.
Первый аргумент – это текущее имя файла, а второй аргумент – это измененное имя. Мы можем изменить имя файла, минуя эти два аргумента.
Приведенный выше код переименовал текущий file2.txt в file3.txt.
Удаление файла
Модуль os предоставляет метод remove(), который используется для удаления указанного файла. Синтаксис метода remove() приведен ниже.
Создание нового каталога
Метод mkdir() используется для создания каталогов в текущем рабочем каталоге. Синтаксис для создания нового каталога приведен ниже.
Метод getcwd()
Этот метод возвращает текущий рабочий каталог.
Синтаксис для использования метода getcwd() приведен ниже.
Изменение текущего рабочего каталога
Метод chdir() используется для изменения текущего рабочего каталога на указанный каталог.
Синтаксис для использования метода chdir():
Удаление каталога
Метод rmdir() используется для удаления указанного каталога.
Синтаксис использования метода rmdir() приведен ниже.
Он удалит указанный каталог.
Запись вывода Python в файлы
В Python есть требования для записи вывода скрипта Python в файл.
Метод check_call() подпроцесса модуля используется для выполнения сценария Python и записи вывода этого сценария в файл.
Следующий пример содержит два сценария Python. Сценарий file1.py выполняет сценарий file.py и записывает свои выходные данные в текстовый файл output.txt.
Методы, связанные с файлом
Существуют следующие методы для управления файлами в различных операционных системах.
Основы работы с файлами в Python
Авторизуйтесь
Основы работы с файлами в Python
автор курса «Full-stack веб-разработчик на Python»
Взаимодействие с файловой системой позволяет хранить информацию, полученную в результате работы программы. Михаил Свинцов из SkillFactory расскажет о базовой функциональности языка программирования Python для работы с файлами.
Встроенные средства Python
Основа для работы с файлами — built-in функция open()
Эти режимы могут быть скомбинированы. Например, «rb» открывает двоичный файл для чтения. Комбинируя «r+» или «w+» можно добиться открытия файла в режиме и чтения, и записи одновременно с одним отличием — первый режим вызовет исключение, если файла не существует, а работа во втором режиме в таком случае создаст его.
По завершении работы с файлом его необходимо закрыть при помощи метода close()
Главное отличие заключается в том, что python самостоятельно закрывает файл, и разработчику нет необходимости помнить об этом. И бонусом к этому не будут вызваны исключения при открытии файла (например, если файл не существует).
Чтение из файла
При открытии файла в режимах, допускающих чтение, можно использовать несколько подходов.
Для начала можно прочитать файл целиком и все данные, находящиеся в нем, записать в одну строку.
Используя эту функцию с целочисленным аргументом, можно прочитать определенное количество символов.
Однако и здесь существует более pythonic way. Он заключается в том, что сам объект io.TextIOWrapper имеет итератор, возвращающий строку за строкой. Благодаря этому нет необходимости считывать файл целиком, сохраняя его в список, а можно динамически по строкам считывать файл. И делать это лаконично.
Запись в файл
Функциональность внесения данных в файл не зависит от режима — добавление данных или перезаписывание файла. В выполнении этой операции также существует несколько подходов.
Самый простой и логичный — использование функции write()
Важно, что в качестве аргумента функции могут быть переданы только строки. Если необходимо записать другого рода информацию, то ее необходимо явно привести к строковому типу, используя методы __str__(self) для объектов или форматированные строки.
Есть возможность записать в файл большой объем данных, если он может быть представлен в виде списка строк.
Здесь есть еще один нюанс, связанный с тем, что функции write() и writelines() автоматически не ставят символ переноса строки, и это разработчику нужно контролировать самостоятельно.
Сила такого подхода заключается в том, что в print() можно передавать не обязательно строковые аргументы — при необходимости функция сама их преобразует к строковому типу.
На этом знакомство с базовой функциональностью работы с файлами можно закончить. Вместе с этим стоит сказать, что возможности языка Python им не ограничивается. Существует большое количество библиотек, которые позволяют работать с файлами определенных типов, а также допускают более тесное взаимодействие с файловой системой. И в совокупности они предоставляют разработчикам легкий и комфортный способ работы с файлами.