查看原文
其他

chardet库:轻松识别文件的编码格式

2017-06-01 大邓 大邓带你玩python

昨天给一位Python爱好者调试代码,败在最容易忽视的编码问题。后来百度发现一个chardet库,可以自动甄别出文件的编码方式,真的很赞,以后读写文件编码就方便多了。

之前大邓存数据时候,经常写 open(path,'w',encoding='utf-8'),写数据时候经常写 open(path,'r',encoding='utf-8')。不论是保存还是读入,都有 encoding='utf-8'是为了将文件编码格式统一。如果不统一,不规范,以后使用数据时候会出现各种Bug,但今天又了这个chardet库,以后 encoding=编码中的编码可以是很容易的就传入值,不用都统一为utf-8.

chardet库文档

  1. http://chardet.readthedocs.io/en/latest/usage.html

小文件的编码判断

detect函数只需要一个 unicode字符串参数,返回一个字典。该字典包括判断到的编码格式及判断的置信度。

  1. with open('test1.txt', 'rb') as f:

  2.    result = chardet.detect(f.read())  

  3. print(result)

返回结果

  1. {'encoding': 'utf-8', 'confidence': 0.99}

百分之99可能为utf-8编码。

大文件的编码判断

考虑到有的文件非常大,如果使用上述方法,全部读入后再判断编码格式,效率会变得非常低下。因此这里对读入的数据进行分块迭代,每次迭代出的数据喂给detector,当喂给detector数据达到一定程度足以进行高准确性判断时, detector.done返回 True。此时我们就可以获取该文件的编码格式。

  1. from chardet.universaldetector import UniversalDetector

  2. bigdata = open('test2.txt','rb')

  3. detector = UniversalDetector()

  4. for line in bigdata.readlines():

  5.    detector.feed(line)

  6.    if detector.done:

  7.        break

  8. detector.close()

  9. bigdata.close()

  10. print(detector.result)

返回结果

  1. {'encoding': 'utf-8', 'confidence': 0.99}

多个大文件的编码判断

如果想判断多个文件的编码,我们可以重复使用单个的UniversalDetector对象。只需要在每次调用UniversalDetector对象时候,初始化 detector.reset(),其余同上。

  1. import os

  2. from chardet.universaldetector import UniversalDetector

  3. detector = UniversalDetector()

  4. dirlist = os.dirlist('/Users/suosuo/Desktop/Test')

  5. for name in dirlist:

  6.    """

  7.    代码为mac上测试,如果为win

  8.    path = os.getcwd()+'\\%s'%name

  9.    """

  10.    path = os.getcwd()+'/%s'%name

  11.    detector.reset()

  12.    for line in open(path, 'rb').readlines():

  13.        detector.feed(line)

  14.        if detector.done:

  15.            break

  16.    detector.close()

  17.    print(detector.result)

输出结果

  1. {'encoding': 'utf-8', 'confidence': 0.99}

  2. {'encoding': 'gb2312', 'confidence': 0.99}

  3. ......

  4. {'encoding': 'utf-8', 'confidence': 0.99}


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存