поиск файлов utf-16 в python. как? - PullRequest
17 голосов
/ 21 июля 2011

Почему-то я не могу найти свой файл utf16. Он генерирует исключение UnicodeException: поток UTF-16 не начинается с спецификации. Мой код:

f = codecs.open(ai_file, 'r', 'utf-16')
seek = self.ai_map[self._cbClass.Text]  #seek is valid int
f.seek(seek)
while True:
    ln = f.readline().strip()

Я пробовал случайные вещи, такие как первое чтение чего-то из потока, не помогло. Я проверил смещение, которое стремится использовать шестнадцатеричный редактор - строка начинается с символа, а не с нулевого байта (я думаю, это хороший знак, верно?) Так как же искать utf-16 в python?

1 Ответ

26 голосов
/ 21 июля 2011

Ну, сообщение об ошибке говорит вам, почему: он не читает метку порядка байтов.Порядок следования байтов находится в начале файла.Не прочитав метку порядка байтов, декодер UTF-16 не может знать, в каком порядке находятся байты. По-видимому, он делает это лениво, при первом чтении, а не при открытии файла - или в противном случае он предполагаетчто seek() запускает новый поток UTF-16.

Если в вашем файле нет спецификации, это определенно проблема, и вы должны указать порядок байтов при открытии файла (см. № 2 ниже).В противном случае я вижу два возможных решения:

  1. Прочитайте первые два байта файла, чтобы получить спецификацию, прежде чем искать.Вы, кажется, говорите, что это не сработало, указывая на то, что, возможно, он ожидает новый поток UTF-16 после поиска, поэтому:

  2. Укажите порядок байтов в явном виде, используя utf-16-le илиutf-16-be в качестве кодировки при открытии файла.

...