Python io – BytesIO, StringIO

Модуль Python io позволяет нам управлять операциями ввода и вывода, связанными с файлами. Преимущество использования модуля IO заключается в том, что доступные классы и функции позволяют расширить функциональность для записи данных в кодировке Unicode.

Модуль Python IO

Существует множество способов использования модуля io для выполнения потоковых и буферных операций в Python. Мы продемонстрируем здесь множество примеров, чтобы подтвердить это утверждение. Давайте начнем.

Python BytesIO

Точно так же, как мы делаем с переменными, данные могут храниться в виде байтов в буфере в памяти при использовании операций ввода-вывода Byte IO модуля io. Вот пример программы для демонстрации этого:

import io

stream_str = io.BytesIO(b"JournalDev Python: \x00\x01")
print(stream_str.getvalue())

Давайте посмотрим на вывод этой программы: Функция getvalue() просто берет значение из буфера как строку.

Python StringIO

Мы даже можем использовать StringIO, который в использовании крайне похож на BytesIO. Вот пример программы:

import io

data = io.StringIO()
data.write('JournalDev: ')
print('Python.', file=data)

print(data.getvalue())

data.close()

Давайте посмотрим вывод этой программы: Обратите внимание, что мы даже закрыли буфер после завершения работы с ним. Это помогает экономить память буфера, так как они хранят данные в памяти. Также мы использовали метод print с необязательным аргументом для указания потока ввода-вывода переменной, что отлично совместимо с оператором вывода.

Чтение с использованием StringIO

После того как мы записали некоторые данные в буфер StringIO, мы также можем их прочитать. Давайте посмотрим на отрывок кода:

import io

input = io.StringIO('This goes into the read buffer.')
print(input.read())

Давайте посмотрим вывод этой программы:

Чтение файла с использованием StringIO

Также возможно читать файл и передавать его по сети в виде байтов. Модуль io можно использовать для преобразования медиафайла, например, изображения, в байты. Вот пример программы:

import io

file = io.open("whale.png", "rb", buffering = 0)
print(file.read())

Давайте посмотрим вывод этой программы: Для запуска этой программы у нас в текущем каталоге должен быть файл изображения whale.png.

io.open() против os.open()

Функция io.open() является более предпочтительным способом выполнения операций ввода-вывода, поскольку она создана как высокоуровневый интерфейс для работы с файлами. Она инкапсулирует дескриптор файла на уровне операционной системы в объект, который мы можем использовать для доступа к файлу в стиле Python. Функция os.open() заботится о более низкоуровневом системном вызове POSIX. Она принимает аргументы на основе POSIX и возвращает дескриптор файла, который представляет открытый файл. Она не возвращает объект файла; возвращаемое значение не будет иметь функций read() или write(). В целом, функция io.open() является всего лишь оболочкой над функцией os.open(). Функция os.open() также устанавливает конфигурацию по умолчанию, такую как флаги и режим, в то время как io.open() этого не делает и зависит от переданных ей значений.

Вывод

В этом уроке мы изучали простые операции модуля ввода-вывода Python и то, как мы можем управлять символами Unicode с помощью BytesIO. Однако, если вы ищете полные операции с файлами, такие как удаление и копирование файла, то прочтите чтение файла Python. Ссылка: Документация по API

Source:
https://www.digitalocean.com/community/tutorials/python-io-bytesio-stringio