Python中如何在UTF-16文件中定位?

17 投票
1 回答
14783 浏览
提问于 2025-04-16 22:00

我不知道为什么我无法在我的UTF-16文件中进行查找。它给我报了个错:'UnicodeException: UTF-16流没有以BOM开头'。这是我的代码:

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

我尝试了一些随机的方法,比如先从流中读取一些东西,但没用。我用十六进制编辑器检查了寻址的偏移量——字符串是从字符开始的,而不是从空字节开始的(我想这应该是个好兆头,对吧?)那么,如何在Python中查找UTF-16文件呢?

1 个回答

27

这个错误信息告诉你原因:它没有读取字节顺序标记。字节顺序标记是在文件的开头。如果没有读取这个标记,UTF-16解码器就不知道字节的顺序是什么。看起来它是懒惰地处理这个问题,也就是说在你第一次读取的时候才去判断,而不是在打开文件的时候就判断——或者它在假设seek()是在开始一个新的UTF-16流。

如果你的文件没有字节顺序标记,那肯定是问题所在,你在打开文件时应该指定字节顺序(见下面的第2点)。否则,我看到有两个可能的解决办法:

  1. 在进行寻址之前,先读取文件的前两个字节来获取字节顺序标记。你似乎说这样做没有效果,这可能是因为它在寻址后期待一个新的UTF-16流,所以:

  2. 在打开文件时,明确指定字节顺序,使用utf-16-leutf-16-be作为编码格式。

撰写回答