[Solved] utf-16 file seeking in python. how?

For some reason i can not seek my utf16 file. It produces ‘UnicodeException: UTF-16 stream does not start with BOM’. My code:

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()

I tried random stuff like first reading something from stream, didnt help. I checked offset that is seeked to using hex editor – string starts at character, not null byte (i guess its good sign, right?)
So how to seek utf-16 in python?

Enquirer: marrat

||
Solution #1:

Well, the error message is telling you why: it’s not reading a byte order mark. The byte order mark is at the beginning of the file. Without having read the byte order mark, the UTF-16 decoder can’t know what order the bytes are in.

Apparently it does this lazily, the first time you read, instead of when you open the file — or else it is assuming that the seek() is starting a new UTF-16 stream.

If your file doesn’t have a BOM, that’s definitely the problem and you should specify the byte order when opening the file (see #2 below). Otherwise, I see two potential solutions:

  1. Read the first two bytes of the file to get the BOM before you seek. You seem to say this didn’t work, indicating that perhaps it’s expecting a fresh UTF-16 stream after the seek, so:
  2. Specify the byte order explicitly by using utf-16-le or utf-16-be as the encoding when you open the file.
Respondent: kindall
The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published.