Шаг 95.
Python: сборник рецептов.
Файлы и ввод-вывод. Запись байтов в текстовый файл

    На этом шаге мы рассмотрим, как это можно реализовать.

Задача

    Вы хотите записать "сырые" байты в файл, открытый в текстовом режиме.

Решение

    Просто запишите байтовые данные в buffer. Например:

>>> import sys
>>> sys.stdout.write(b'Hello\n')
Traceback (most recent call last):
  .   .   .   .
TypeError: must be str, not bytes 
>>> sys.stdout.buffer.write(b'Hello\n')
Hello
5
>>>

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


Выполнение последней строки может вызвать появление следующей ошибки:
Traceback (most recent call last):
  .   .   .   .
AttributeError: 'StdOutputFile' object has no attribute 'buffer' 
Ошибка возникает из-за того, что sys.stdout - это не двоичный поток, а текстовый.

    Чтобы исправить:




Обсуждение

    Система ввода-вывода построена на слоях. Текстовые файлы конструируются путем добавления слоя кодирования/декодирования в Unicode поверх буферизованного файла, открытого в бинарном режиме. Атрибут buffer просто ссылается на этот файл. Если вы обращаетесь к нему, то обходите слой текстового кодирования/декодирования.

    Пример с sys.stdout может быть рассмотрен как особый случай. По умолчанию sys.stdout всегда открывается в текстовом режиме. Однако если вы пишете скрипт, которому на самом деле нужно сбрасывать бинарные данные в стандартный вывод, то можете использовать показанный прием для обхода текстовой кодировки.

    На следующем шаге мы рассмотрим оборачивание существующего дескриптора файла для использования в качестве объекта файла.




Предыдущий шаг Содержание Следующий шаг