Python中如何在UTF-16文件中定位?
我不知道为什么我无法在我的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点)。否则,我看到有两个可能的解决办法:
在进行寻址之前,先读取文件的前两个字节来获取字节顺序标记。你似乎说这样做没有效果,这可能是因为它在寻址后期待一个新的UTF-16流,所以:
在打开文件时,明确指定字节顺序,使用
utf-16-le
或utf-16-be
作为编码格式。