В файлах, закодированных в Windows "Unicode" (UTF16), первые 2 байта обычно представляют собой маркер порядка байтов (BOM) со значением 0xFF 0xFE.Это указывает на кодирование UTF16 с прямым порядком байтов.Файлы «ANSI» (обычно Windows-1252) не имеют маркера.
При попытке прочитать файл UTF16, как если бы он был закодирован с использованием другой 8-битной кодировки, например, UTF8, Windows-1252 или ASCIIувидит исключение UnicodeDecodeError
, потому что 0xFF не является действительным байтом в этих кодировках (или действительным начальным байтом для UTF-8).
Итак, если вы точно знаете, что файлы будут либо UTF-В кодировке 16-LE или Windows-1252, вы можете проверить наличие спецификации UTF16 в начале файла и открыть файл с этой кодировкой, если он обнаружен:
import sys
from codecs import BOM_UTF16_LE
def get_file_encoding(filename, default=None):
with open(filename, 'rb') as f:
if f.read(2) == BOM_UTF16_LE:
return 'utf_16'
return default if default else sys.getdefaultencoding()
with open(filename, encoding=get_file_encoding(filename, 'windows_1252')) as f:
for line in f:
for phrase in key_phrases:
if phrase in line:
print(line)
break
Кроме того, вы можете рассмотреть возможность использования обычнойвыражения для соответствия фраз вместо циклического перебора возможных фраз.