2013-04-10 161 views
16

我有大约1000个文件名,由os.listdir() 读取,其中一些编码为'utf-8',一部分为'cp1252'。Python检测字符串字节编码

我想将它们全部解码为unicode,以便在脚本中进一步处理。有没有办法让源编码正确解码成unicode?

例子:

for item in os.listdir(rootPath): 

    #Convert to Unicode 
    if isinstance(item, str): 
     item = item.decode('cp1252') # or item = item.decode('utf-8') 
    print item 

回答

22

如果你的文件不管是在cp1252utf-8,然后有一个简单的方法。

import logging 
def force_decode(string, codecs=['utf8', 'cp1252']): 
    for i in codecs: 
     try: 
      return string.decode(i) 
     except UnicodeDecodeError: 
      pass 

    logging.warn("cannot decode url %s" % ([string])) 

for item in os.listdir(rootPath): 
    #Convert to Unicode 
    if isinstance(item, str): 
     item = force_decode(item) 
    print item 

否则,有一个字符集检测库。

Python - detect charset and convert to utf-8

https://pypi.python.org/pypi/chardet

+13

避免使用空白'except:'。它抓住了一切,甚至是基于系统的异常。在这种情况下'除了Exception:'或',UnicodeError:'可能是最有意义的。 – twasbrillig 2015-02-11 21:57:28

+3

除了空白处的好处,但我相信正确的异常是'UnicodeDecodeError' – guival 2016-06-07 11:34:24

5

使用的chardet库。这是超级容易

import chardet 

the_encoding = chardet.detect('your string')['encoding'] 

就是这样!