На этом шаге мы рассмотрим назначение и методы, используемые для работы с этим типом данных.
Тип данных bytearray является разновидностью типа bytes и поддерживает те же самые методы и операции. В отличие от типа bytes, тип bytearray допускает возможность непосредственного изменения объекта и содержит дополнительные методы, позволяющие выполнять эти изменения.
Создать объект типа bytearray можно следующими способами:
>>> bytearray() bytearray(b'') >>> bytearray("строка", "cp1251") bytearray(b'\xf1\xf2\xf0\xee\xea\xe0') >>> bytearray("строка") Traceback (most recent call last): File "<pyshell#47>", line 1, in <module> bytearray("строка") TypeError: string argument without an encoding
В третьем параметре могут быть указаны значения "strict" (при ошибке возбуждается исключение UnicodeEncodeError - значение по умолчанию), "replace" (неизвестный символ заменяется символом вопроса) или "ignore" (неизвестные символы игнорируются). Примеры:
>>> bytearray("string\uFFFD", "cp1251", "strict") Traceback (most recent call last): File "<pyshell#50>", line 1, in <module> bytearray("string\uFFFD", "cp1251", "strict") File "C:\Python38-32\lib\encodings\cp1251.py", line 12, in encode return codecs.charmap_encode(input,errors,encoding_table) UnicodeEncodeError: 'charmap' codec can't encode character '\ufffd' in position 6: character maps to <undefined> >>> bytearray("string\uFFFD", "cp1251", "ignore") bytearray(b'string')
>>> b = bytearray([225, 226, 224, 174, 170, 160]) >>> b bytearray(b'\xe1\xe2\xe0\xae\xaa\xa0') >>> bytearray(b'\xe1\xe2\xe0\xae\xaa\xa0') bytearray(b'\xe1\xe2\xe0\xae\xaa\xa0') >>> str(b, "cp866") 'строка'
>>> bytearray(5) bytearray(b'\x00\x00\x00\x00\x00')
>>> b = bytearray.fromhex(" e1 e2e0ae aaa0") >>> b bytearray(b'\xe1\xe2\xe0\xae\xaa\xa0') >>> str(b, "cp866") 'строка'
Тип bytearray относится к изменяемым типам. Поэтому можно не только получить значение по индексу, но и изменить его (что не свойственно строкам):
>>> b = bytearray("Python", "ascii") >>> b[0] # Можем получить значение 80 >>> b[0] = b"J"[0] # Можем изменить значение >>> b bytearray(b'Jython')
При изменении значения важно помнить, что присваиваемое значение должно быть целым числом в диапазоне от 0 до 255. Чтобы получить число в предыдущем примере, мы создали объект типа bytes, а затем присвоили значение, расположенное по индексу 0 (b[0] = b"J"[0]). Можно, конечно, сразу указать код символа, но ведь держать все коды символов в памяти свойственно компьютеру, а не человеку.
Дяя изменения объекта можно также использовать следующие методы:
>>> b = bytearray("string", "ascii") >>> b.append(b"1"[0]); b bytearray(b'string1')
>>> b = bytearray("string", "ascii") >>> b.extend(b"123"); b bytearray(b'string123')
Добавить несколько элементов можно с помощью операторов + и +=:
>>> b = bytearray("string", "ascii") >>> b + b"123" # Возвращает новый объект bytearray(b'string123') >>> b += b"456"; b # Изменяет текущий объект bytearray(b'string456')
Кроме того, можно воспользоваться операцией присваивания значения срезу:
>>> b = bytearray("string", "ascii") >>> b[len(b):] = b"123" # Добавляем элементы в последовательность >>> b bytearray(b'string123')
Добавим элемент в начало объекта:
>>> b = bytearray("string", "ascii") >>> b.insert(0, b"1"[0]); b bytearray(b'1string')
Метод insert() позволяет добавить только один элемент. Чтобы добавить несколько элементов, можно воспользоваться операцией присваивания значения срезу. Добавим несколько элементов в начало объекта:
>>> b = bytearray("string", "ascii") >>> b[:0] = b"123"; b bytearray(b'123string')
>>> b = bytearray("string", "ascii") >>> b.pop() # Удаляем последний элемент 103 >>> b bytearray(b'strin') >>> b.pop(0) # Удаляем первый элемент 115 >>> b bytearray(b'trin')
Удалить элемент списка позволяет также оператор del:
>>> b = bytearray("string", "ascii") >>> del b[5] # Удаляем последний элемент >>> b bytearray(b'strin') >>> del b[:2] # Удаляем первый и второй элементы >>> b bytearray(b'rin')
>>> b = bytearray("strstr", "ascii") >>> b.remove(b"s"[0]) # Удаляем только первый элемент >>> b bytearray(b'trstr')
>>> b = bytearray("string", "ascii") >>> b.reverse(); b bytearray(b'gnirts')
Преобразовать объект типа bytearray в строку позволяет метод decode(). Метод имеет следующий формат:
decode([encoding="utf-8"][, errors="strict"])
Параметр encoding задает кодировку символов (по умолчанию UTF-8) в объекте bytearray, а параметр errors - способ обработки ошибок при преобразовании. В параметре errors можно указать значения "strict" (значение по умолчанию), "replace" или "ignore". Пример преобразования:
>>> b = bytearray("строка", "cp1251") >>> b.decode(encoding="cp1251"), b.decode("cp1251") ('строка', 'строка')
Для преобразования можно также воспользоваться функцией str():
>>> b = bytearray("строка", "cp1251") >>> str(b, "cp1251") 'строка'
На следующем шаге мы рассмотрим преобразование объекта в последовательность байтов.