Wednesday, October 20, 2010

python处理unicode的方法

在python docs的how to unicode已经有很好的关于unicode编程方法了。

不过对于未知编码的文件的读取还是没有涉及。比如一个文本文件,读取前并不知道它的编码是utf-8,gb18030,还是latin-1。

对于这种情况,可有两种处理方法,一种是用预设的编码来读取文件,检测抛出的exception,知道找到正确的编码方式,另外一种是用chardet模块来检测文件的编码,再用相应的编码来打开文件。

代码如下:
#########################################################
import os, chardet

f1=open('test', 'r', encoding='gbk')
t1=f1.read()
#cod1=chardet.detect(t1)["encoding"]
print(t1)

f2=open('test_gbk', 'rb')
t2=f2.read(9)
cod2=chardet.detect(t2)["encoding"]
print(cod2) 1 import os, chardet
  2 
  3 f1=open('test', 'r', encoding='gbk')
  4 t1=f1.read()
  5 #cod1=chardet.detect(t1)["encoding"]
  6 print(t1)
  7 
  8 f2=open('test_gbk', 'rb')
  9 t2=f2.read(9)
 10 cod2=chardet.detect(t2)["encoding"]
 11 print(cod2)
#########################################################
test和test_gbk都是内容为"hello,这是一个测试数据",分别以utf-8和gbk来保存。

第一段就是按照指定编码的方法来读,在print(t1)之前都不会抛出异常,只有在print时才会抛出解码异常,所以效率比较差。

第二段是将文件以二进制方式打开,读入9byte数据,通过chardet的detect方法来检测编码。
之后可以在以检测编码方式打开文本文件,缺点是需要两次打开文件,同时detect到的编码也不一定准确,像gb18030编码的文件如果读入的byte数据不够的话,很容易被误检测为latin-2,除非整个文件一次读入。

整体来讲还是chardet的方法较为简洁,对于小文件检测,建议全文读入,对于很大的文件,只能读一定缓存的内容,需要添加编码错误的处理代码。


No comments: