匿名用户
1级
2017-01-15 回答
有。
使用chardet库。它会去猜测文本文件的编码,并返回形如:
编码类型:utf-8
置信度:0.9
这样的结果,也就是说chardet断定该文件有90%的可能性是utf-8编码的。
不过chardet的缺陷就是,它不能完全100%确定文件的编码类型。
目前我的做法是,如果置信度超过0.95,那么就认定chardet的判断结果是正确的。否则,再加上一些人机交互操作进行判断。
目前,chardet库官网提供的版本只适用于Python 2,如果您使用的是Python 3.x,我可以另外上传一个。
追问:
我原来写过一个
s=open(path)
s.seek(0)
signature = s.read(3)
if signature.encode('hex') == 'efbbbf':
pass
else:
s.seek(0)
能不能根据这个改下? efbbbf是什么编码 不是utf8吗 为什么我写了之后还是不管用呢
追答:
1. 文件打开后,文件位置指针就位于文件开头部分,所以s.seek(0)这个调用可以不要。
2. encode('hex')在Python 3.3中有错。在Python2.7中,encode('hex')会产生signature的十六进制形式的字符串。比如'abc'.encode('hex')将得到:'616263'。
3. 在Python 3中,如果源程序中没有额外的编码类型声明,那字符串字面量是utf-8编码的(Python 3.x不再有string 和 unicode string之分)。在Python 2.7中,字符串分普通的和unicode的。
追问:
前两个你说的我明白 第三个不明白
我现在有几个问题
1. 这样写能不能做到转码的需求?
2.efbbbf是utf8用的吗?
追答:
EF BB BF确实是utf-8的BOM,但是并不是所有以UTF-8编码的文本文件都有BOM的。
追问:
那我要用代码转换 怎样转 不能用你说的那个
我的代码是意思
将指针指向第三个字节位置 判断txt开头是不是utf8的
是的话 就从第四个字节开始读
不是的话 则将指针指回0
追答:
刚用了下Python 2.7,发现open函数没有encode参数。
所以,我这样解决:
# -*- coding: utf-8-*-
words = u'您好'
# 生成以gbk编码的测试文件
fp = open('file.txt', 'w')
fp.write(words.encode('gbk'))
fp.close()
# 读取gbk文件
fp = open('file.txt')
words = fp.read()
fp.close()
print words
# 先解码,再按照新的编码类型重新编码,并写入文件
words = words.decode('gbk')
fp = open('file_utf-8.txt', 'w')
fp.write(words.encode('utf-8'))
fp.close()
追问:
你还是没有明白我的意思 我不是要问转码
我的意思是 先判断是什么编码 我主要想知道是这个过程
至于重新编码并写入 这个想法根本就不现实
我一个txt就要1G 若这个 很浪费空间 再说 这个等于又新建了一个
追答:
如果单纯判断编码类型的话,前面我已经提过chardet。而且这个库使用起来一点都不难(你需要了解的不超过3个函数)。
如果您的文件编码类型只可能是gbk或者utf-8的话,自己判断也可以。
1. 如果文件以UTF-8编码,并且确认它包含BOM,那么上面您给出的那段代码就可以用。如果没找到BOM就判定为gbk的(而且,这种情况下,以)。
2. 如果文件是以UTF-8的,但是没有BOM的话,上面的方法就不起作用了。