Python字符串比较失败求助:列表元素带u"foo"前缀导致不匹配
解决思路:Python 2中str与unicode字符串不匹配问题
这问题我之前帮人排查过,本质是Python 2里**字节字符串(str类型)和Unicode字符串(unicode类型)**的类型不匹配问题——虽然打印出来都是foo,但它们是两种不同的数据类型,直接用==比较就会返回False。给你几个递进的解决思路:
先确认变量类型
先打印两个变量的类型,彻底坐实问题:print(type(list1[0]), type(list2[0]))你应该会看到输出类似
<type 'str'> <type 'unicode'>,这就确认了类型差异是问题根源。修改比较方法,统一类型后再比较
最直接的解决方式是在text_match方法里把两个输入统一转成同一种类型(推荐统一转成Unicode,兼容性更好):def text_match(self, expected, actual): # 把字节字符串转成Unicode(假设你的str是UTF-8编码,根据实际情况调整) if isinstance(expected, str): expected = expected.decode('utf-8') if isinstance(actual, str): actual = actual.decode('utf-8') return expected == actual如果你确定字符串都是ASCII字符,也可以把Unicode转成str(但非ASCII字符会报错,不推荐):
def text_match(self, expected, actual): if isinstance(expected, unicode): expected = expected.encode('ascii') if isinstance(actual, unicode): actual = actual.encode('ascii') return expected == actual排查你之前编码/解码无效的原因
你说尝试编码解码无效,大概率是用错了编码格式。比如你的str是GBK编码,但你用了UTF-8解码,结果会出现乱码,自然比较还是False。可以先通过sys.getdefaultencoding()查看Python默认编码,或者尝试用unicode-escape解码试试:print(list1[0].decode('unicode-escape'))从源头统一字符串类型
治标不如治本,建议排查为什么两个列表会出现不同类型的字符串:比如list1是从普通文件读取的字节串,list2是从接口/数据库拿到的Unicode。后续可以统一处理:比如用codecs.open读取文件直接得到Unicode,或者所有字符串处理逻辑都先转成Unicode,避免再出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者user3081458
相关产品推荐
相关产品推荐

