【问题】
在折腾自己的一个python脚本,把所使用的chardet库,从1.0.1升级到1.1后,结果运行我的的python脚本,却出错:
LINE 810 : INFO [0001] http://againinput4.blog.163.com/blog/static/172799491201091513711591 LINE 886 : INFO Title = intro libs/thirdparty\chardet\universaldetector.py:90: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - inte rpreting them as being unequal if aBuf[:len(chunk)] == chunk: LINE 1617 : INFO Exporting items at last ...
【解决过程】
1.后来换为旧的1.0.1版本的chardet,就可以正常运行了,就没了此警告。
2。去比较了一下,两者之间的代码的区别:
(1)1.0.1的chardet的universaldetector.py的相关的代码:
def feed(self, aBuf):
if self.done: return
charmap = (
# EF BB BF UTF-8 with BOM
('\xEF\xBB\xBF', {'encoding': "UTF-8", 'confidence': 1.0}),
# FF FE 00 00 UTF-32, little-endian BOM
('\xFF\xFE\x00\x00', {'encoding': "UTF-32LE", 'confidence': 1.0}),
# 00 00 FE FF UTF-32, big-endian BOM
('\x00\x00\xFE\xFF', {'encoding': "UTF-32BE", 'confidence': 1.0}),
# FE FF 00 00 UCS-4, unusual octet order BOM (3412)
(u'\xFE\xFF\x00\x00', {'encoding': "X-ISO-10646-UCS-4-3412", 'confidence': 1.0}),
# 00 00 FF FE UCS-4, unusual octet order BOM (2143)
(u'\x00\x00\xFF\xFE', {'encoding': "X-ISO-10646-UCS-4-2143", 'confidence': 1.0}),
# FF FE UTF-16, little endian BOM
('\xFF\xFE', {'encoding': "UTF-16LE", 'confidence': 1.0}),
# FE FF UTF-16, big endian BOM
('\xFE\xFF', {'encoding': "UTF-16BE", 'confidence': 1.0}),
)
aLen = len(aBuf)
if not aLen: return
if not self._mGotData:
# If the data starts with BOM, we know it is UTF
for chunk, result in charmap:
if aBuf[:len(chunk)] == chunk:
self.result = result
break(2)1.1的chardet的universaldetector.py的相关的代码:
def feed(self, aBuf):
if self.done: return
aLen = len(aBuf)
if not aLen: return
if not self._mGotData:
# If the data starts with BOM, we know it is UTF
if aBuf[:3] == '\xEF\xBB\xBF':
# EF BB BF UTF-8 with BOM
self.result = {'encoding': "UTF-8", 'confidence': 1.0}
elif aBuf[:4] == '\xFF\xFE\x00\x00':
# FF FE 00 00 UTF-32, little-endian BOM
self.result = {'encoding': "UTF-32LE", 'confidence': 1.0}
elif aBuf[:4] == '\x00\x00\xFE\xFF':
# 00 00 FE FF UTF-32, big-endian BOM
self.result = {'encoding': "UTF-32BE", 'confidence': 1.0}
elif aBuf[:4] == '\xFE\xFF\x00\x00':
# FE FF 00 00 UCS-4, unusual octet order BOM (3412)
self.result = {'encoding': "X-ISO-10646-UCS-4-3412", 'confidence': 1.0}
elif aBuf[:4] == '\x00\x00\xFF\xFE':
# 00 00 FF FE UCS-4, unusual octet order BOM (2143)
self.result = {'encoding': "X-ISO-10646-UCS-4-2143", 'confidence': 1.0}
elif aBuf[:2] == '\xFF\xFE':
# FF FE UTF-16, little endian BOM
self.result = {'encoding': "UTF-16LE", 'confidence': 1.0}
elif aBuf[:2] == '\xFE\xFF':
# FE FF UTF-16, big endian BOM
self.result = {'encoding': "UTF-16BE", 'confidence': 1.0}从代码中,其实好像也看不出太多问题。
3. 而网上找了些相关的错误的解释,很多说是,由于使用chardet之前,需要先用yourStr.decode("utf16-be")之类的先去解码,然后就可以解决问题了。
而我此处,懒得去详细折腾了。毕竟出现的警告是由于chardet库从1.0.1升级到1.1所导致的。
【总结】
而此处,或许是需要我调用chardet前,也需要处理编码/解码等事情,或许是chardet库本身写的不够好。
但是我的此处的需求是,chardet够用,也就好了,暂时没兴趣去详细调试,等以后有需要时再说。
所以此处的解决办法是:
暂时不把chardet升级到1.1了,还是使用旧的1.0.1的chardet就够用了,也不会有此警告出现。
转载请注明:在路上 » 【已解决】Python脚本运行出错:libs/thirdparty\chardet\universaldetector.py:90: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode – interpreting them as being unequal