Python: 如何读取和解析Unicode编码的UTF-8文本文件?

3
我将从Excel中导出UTF-8文本,并希望使用Python读取和解析传入的数据。我已经阅读了所有在线信息,因此已经尝试过以下操作:
 txtFile = codecs.open( 'halout.txt', 'r', 'utf-8' )
 for line in txtFile:
  print repr( line )

我遇到的错误是:
UnicodeDecodeError: 'utf8' 编解码器无法解码位置 0 的字节 0xff:出现意外的代码字节
在十六进制编辑器中查看文本文件,前面的值为 FFFE。我还尝试了:
txtFile.seek( 2 )

在“open”之后立即使用会导致另一个错误。


2
不知何故,您正在导出的文本不是UTF-8编码,但它可能是Unicode的不同编码,例如UTF-16。这些都是不同的。关于这个主题有很多要了解的!如果您阅读这两篇文章,您将像从未掌握过一样掌握它:http://www.joelonsoftware.com/articles/Unicode.html http://www.amk.ca/python/howto/unicode - u0b34a0f6ae
4个回答

5

该文件不是UTF-8格式的;它是带有字节顺序标记的UTF-16LE


1
惊人的超能力! - Justin R.
1
你如何仅通过前两个字节区分UTF-16LE和UTF-32LE? - jfs
好的观点;一个人是做不到的。我从未在文件中遇到过UTF-32,但我肯定它曾经发生过。只有一次。像疯了一样。 - Jonathan Feinberg

2

这是一个BOM

从评论中可以看出,这是一个UTF-16 BOM。

codecs.open('foo.txt', 'r', 'utf-16')

应该可以工作。


从您提供的维基百科页面中可以得知:“BOM的UTF-8表示是字节序列EF BB BF”-- 因此,该文件不是UTF-8编码(由于OP看到FFFE,它是UTF-16小端序)。 - jfs
错误:"UnicodeDecodeError: 'utf8' codec无法解码字节0xff,位置为0:意外的代码字节" - Mark Byers

2

在Johnathan的评论基础上,这段代码应该能够正确读取文件:

import codecs
txtFile = codecs.open( 'halout.txt', 'r', 'utf-16' )
for line in txtFile:
   print repr( line )

0

尝试查看Excel文件是否有一些空行(然后再次有值),这可能会导致意外错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接