使用通用编码检测器(chardet)在Python中检测文本文件中的字符

28 投票
1 回答
54900 浏览
提问于 2025-04-16 01:45

我正在尝试在Python中使用通用编码检测器(chardet)来检测一个文本文件('infile')中最可能的字符编码,并在后续处理中使用这个编码。

虽然chardet主要是为了检测网页的字符编码,但我找到一个例子,展示了它是如何用于单个文本文件的。

不过,我还搞不清楚怎么让脚本把最可能的字符编码设置到变量'charenc'中(这个变量在脚本中用到了好几次)。

我的代码是基于前面提到的例子和chardet的文档组合而成的,代码如下:

import chardet    
rawdata=open(infile,"r").read()
chardet.detect(rawdata)

检测字符编码是必要的,因为脚本接下来会运行以下内容(还有其他类似的用法):

inF=open(infile,"rb")
s=unicode(inF.read(),charenc)
inF.close()

任何帮助都将非常感激。

1 个回答

70

chardet.detect() 会返回一个字典,这个字典里有一个键叫 'encoding',它的值就是你要找的编码方式。所以你可以这样做:

import chardet    
rawdata = open(infile, 'rb').read()
result = chardet.detect(rawdata)
charenc = result['encoding']

关于 chardet 的文档 并没有明确说明文本字符串和字节字符串是否可以和这个模块一起使用,但可以推测,如果你有一个文本字符串,就不需要对它进行字符检测,因此你应该传入字节字符串。所以在调用 open() 时要加上二进制模式标志 b。不过,chardet.detect() 也可能在某些情况下可以处理文本字符串,这取决于你使用的 Python 版本和库的版本。也就是说,如果你省略了 b,你可能会发现它仍然能正常工作,尽管从技术上讲你是在做错事。

撰写回答