На этом шаге мы рассмотрим назначение и использование этого класса.
Класс StringIO работает только со строками. Чтобы выполнять аналогичные операции с "файлами", представляющими собой последовательности байтов, следует использовать класс BytesIO из модуля io. Формат конструктора класса:
BytesIO ([<Начальное значение>] )
Класс BytesIO поддерживает такие же методы, что и класс StringIO, но в качестве значений методы принимают и возвращают последовательности байтов, а не строки. Рассмотрим основные операции на примере:
>>> import io # Подключаем модуль >>> f = io.BytesIO(b"String1\n") >>> f.seek (0, 2) # Перемещаем указатель в конец "файла" 8 >>> f.write (b"String2\n") # Пишем в "файл" 8 >>> f.getvalue () # Получаем содержимое "файла" b'String1\nString2\n' >>> f.seek(0) # Перемещаем указатель в качало "файла" 0 >>> f.read () # Считываем данные b'String1\nString2\n' >>> f.close () # Закрываем "файл"
Класс BytesIO поддерживает также метод getbuffer(), который возвращает ссылку на объект memoryview. С помощью этого объекта можно получать и изменять данные по индексу или срезу, преобразовывать данные в список целых чисел (с помощью метода tolist()) или в последовательность байтов (с помощью метода tobytes()). Пример:
>>> f = io.BytesIO(b"Python") >>> buf = f.getbuffer () >>> bytes(buf[0:1]) # Получаем первый символ строки b'P' >>> buf [0] = b"J"[0] # Изменяем значение по индексу >>> f.getvalue () # Получаем содержимое b'Jython' >>> buf.tolist() # Преобразуем в список чисел [74, 121, 116, 104, 111, 110] >>> buf.tobytes () # Преобразуем в тип bytes b'Jython' >>> f.close () # Закрываем "файл"
На следующем шаге мы рассмотрим права доступа к файлам и каталогам.