Ответ 1
Я думаю, вы используете Python 3.
1. Открытие файла в двоичном режиме является простым, но тонким. Единственное различие от его открытия в текстовом режиме это параметр mode содержит 'b'характер.
........
4. Имеет одно отличие: объект двоичный поток не имеет кодировки атрибут. Это имеет смысл, не так ли? Вы читаете (или записываете) байты, а не строки, поэтому theres нет преобразования для Python.
Затем, в Python 3, поскольку двоичный поток из файла представляет собой поток байтов, регулярное выражение для анализа потока из файла должно быть определено с помощью последовательности байтов, а не последовательности символов.
В Python 2 строка была массивом байты, кодировка символов которых отслеживается отдельно. Если бы вы хотели Python 2 отслеживать кодирования символов, вам пришлось использовать Строка Unicode (u ''). Но в Python 3, строка всегда Python 2 называется строкой Unicode - т.е. массив Unicode символов (возможно, варьируемого байта длина).
http://www.diveintopython3.net/case-study-porting-chardet-to-python-3.html
и
В Python 3 все строки являются последовательностями символов Unicode. Здесь нет такая вещь, как закодированная строка Python в UTF-8 или в кодировке Python как СР-1252. "Это строка UTF-8?" является неверный вопрос. UTF-8 - это способ кодирование символов в виде последовательности байт. Если вы хотите взять строку и превратить его в последовательность байтов в конкретной кодировке символов, Python 3 поможет вам в этом.
и
4,6. Строки против байтов # Байты - байты; символы являются абстракцией. Неизменяемая последовательность Unicode символы называются строкой. неизменяемая последовательность число-от-0 до 255 называется байтов.
....
1. Чтобы определить объект байта, используйте синтаксис b '' 'byte literal. Каждый байт в байтовом литерале может быть Символ ASCII или закодированный шестнадцатеричное число от \x00 до\xff (0-255).
Итак, вы будете определять свое регулярное выражение следующим образом
pat = re.compile(b'[a-f]+\d+')
а не как
pat = re.compile('[a-f]+\d+')
Дополнительные пояснения здесь:
15.6.4. Невозможно использовать строковый шаблон для байтового объекта