Вспомогательные классы io. StringIO и io. BytesIO

vspomogatelnye klassy io stringio i io bytesio Контекст выполнения сценариев

Прием перенаправления потоков ввода-вывода в объекты, о котором рассказывалось в предыдущем разделе, оказался настолько удобным на практике, что в стандартную библиотеку был добавлен модуль, автоматизирующий задачу его применения в большинстве случаев (хотя в некоторых случаях, например, при реализации графического интерфейса, все еще может потребоваться писать свой программный код). В стандартной библиотеке имеется объект, который добавляет интерфейс объектов файлов к объектам строк, хранящимся в памяти. Например:

>   >> from io import StringIO

>>> buff = StringIO() # сохраняет записываемый текст в строке

>>> buff.write(‘spam\n’)

5

>>> buff.write(‘eggs\n’)

5

>>> buff.getvalue()

‘spam\neggs\n’

>>> buff = StringIO(‘ham\nspam\n’) # возвращает входные данные из строки

>>> buff.readline()

‘ham\n’

>>> buff.readline()

spam\n

>>> buff.readline()

Экземпляры класса StringIO могут присваиваться переменным sys.stdin и sys.stdout, как демонстрировалось в предыдущем разделе, с целью перенаправить потоки для функций input и print, и использоваться в любом программном коде, выполняющем операции с настоящими объектами файлов. Напомню еще раз, что в языке Python правила игры определяются интерфейсом объекта, а не его конкретным типом:

>>> from io import StringIO

>>> import sys

>>> buff = StringIO()

>   >> temp = sys.stdout

>   >> sys.stdout = buff

>   >> print(42, ‘spam’, 3.141) # или print(…, file=buff)

>   >> sys.stdout = temp # восстановит оригинальный поток

>   >> buff.getvalue()

‘42 spam 3.141\n’

Следует также отметить, что существует класс io.BytesIO, обладающий похожим поведением, но он отображает операции с файлами не на строку типа str, а на буфер байтов типа bytes:

>  >> from io import BytesIO

>>> stream = BytesIO()

>>> stream.write(b’spam’)

>>> stream.getvalue()

b’spam’

>>> stream = BytesIO(b’dpam’)

>>> stream.read()

b’dpam’

Из-за существенных различий между текстовыми и двоичными данными в Python 3.X эта альтернатива может оказаться более подходящей для сценариев, имеющих дело с двоичными данными. Подробнее с проблемой различий между текстовыми и двоичными данными мы познакомимся в следующей главе, когда займемся исследованием файлов.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий