odoo python 第三方库chardet-自动识别文本编码方式

chardet 库一个开源库,自动识别文本的编码方式,如你看到一样。

字符编码是什么?

你看到的在电脑屏幕显示的文字和字符,就是文本。计算机不会处理“字符”和“符合”,只处理字节。你在计算机看到的每一段文本,实际上,都是存储再特定的字符编码中。对于像汉语,俄语,英语,其他一些多语言,有许多不同种的优化的字符编码方式。 大体可以认为,字符编码就是为你在电脑屏幕看到的东西和在计算机实际存储的东西的映射。

自动识别字符编码是如何实现的?

就是不需要你提供编码方式,就可以识别出文本二进制形式的(bytes)是什么编码形式。

chardet 支持的编码方式

汉语: Big5,GB2312/GB18030, EUC-TW, HZ-GB-2312,and ISO_2022-CN

UTF: UTF-32 BE,LE,3412-ordered, 2143-ordered(with a BOM)

UTF-16 BE or LE(with a BOM)

UTF-8 (with or without a BOM)

用法:

基本用法


import urllib
rawdata = urllib.request.urlopen('http://yahoo.co.jp/").read()
import chardet
# 直接识别“文本的二进制”形式的文本
chardet.detect(rawdata)

 

高级用法

一部分一部分的文本识别

如果要处理大段文本的时候,可以一部分一部分的进行识别。可以使用 Uiversal Encoding Detector 库,渐进式的识别。

先创建一个 UniversalDetector 对象,调用 feed方法,分段识别每一段文本。如果达到最小阈值的时候,detector.done 就会设置为 True.

一旦做完检测,可以调用 detector.close(), 将会最后的算法进行处理数据,可以通过detector.result 返回一个字典结果。{“encoding”:””,”confidence”:0.00}


import urllib
from chardet.universaldetector import UniversalDetector

usock = urllib.request.urlopen('http://yahoo.co.jp/')
detector = UniversalDetector()
for line in usock.readlines()
    detector.feed(line)
    if detector.done: break
detector.close()
usock.close()
print(detector.result)

处理多个文本的时候,可以通过“reset”方法,重新进行计算,不需要重复创建”UniversalDetector”对象


import glob
from chardet.universaldetector import UniversalDetector
detector = UniversalDetector()
from filename in glob.glob('*.xml'):
     print(filename.ljust(60))
     detector.reset() # 重置解析器
     for line in file(filename, 'rb'):
         detector.feed(line)
         if detector.done: break
     detector.close()
     print(detector.result)

总结

  1. chardet 有两种自动识别文本编码方式的方法。基本方式和高级方式。
  2. 基本方式: 针对一小段文本进行识别。chardet.detect()
  3. 高级方式: 针对大段文本形式进行识别。使用对象UniversalDetector. 属性和方法: feed(), close(), done, result
  4. 基本方式也是基于高级方式进行处理的。(简化版本)
  5. 批量处理文本,可以使用reset方法进行重置UniversalDetector对象。

您可能也喜欢...

发表评论

邮箱地址不会被公开。 必填项已用*标注