Я думаю, что вы используете Python 3.
1.Открытие файла в бинарном режиме просто, но тонко. Единственная разница
от открытия его в текстовом режиме является то, что
параметр mode содержит 'b'
характер.
........
4.Все есть одно отличие: двоичный поток объект не имеет кодировки
приписывать. Это имеет смысл, верно?
Вы читаете (или пишете) байты , а не
строки, поэтому нет преобразования для
Python, чтобы сделать.
http://www.diveintopython3.net/files.html#read
Затем в 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 все строки являются последовательностями
символов Юникода . Здесь нет
такая вещь, как строка Python в кодировке
в UTF-8 или в кодировке строки Python
как CP-1252. «Эта строка UTF-8?»
неверный вопрос. UTF-8 - это способ
кодирование символов в виде последовательности
байт. Если вы хотите взять строку
и превратить его в последовательность байтов
в конкретной кодировке символов,
Python 3 может помочь вам в этом.
http://www.diveintopython3.net/strings.html#boring-stuff
и
4,6. Строки против байтов # Байты являются байтами; символы являются абстракцией.
Неизменная последовательность Unicode
символы называются строкой.
неизменная последовательность
Числа между 0 и 255 называется
байтовый объект.
....
1. Чтобы определить байтовый объект, используйте синтаксис b '' “byte literal” . Каждый байт
в байтовом литерале может быть
ASCII символ или закодированный
шестнадцатеричное число от \ x00 до \ xff
(0-255).
http://www.diveintopython3.net/strings.html#boring-stuff
Итак, вы определите свое регулярное выражение следующим образом
pat = re.compile(b'[a-f]+\d+')
а не как
pat = re.compile('[a-f]+\d+')
Больше объяснений здесь:
15.6.4. Невозможно использовать строковый шаблон в байтовоподобном объекте