从列表提取HTTPS URL时触发TypeError,求问题排查与解决
解决TypeError: a bytes-like object is required, not 'str'问题
嘿,这个报错的原因一眼就能看出来——你列表里的所有元素都是bytes类型(每个元素前面的b就是标记),但你却用字符串"https"去做包含判断,Python可不允许bytes和str直接这么对比,类型不匹配自然就抛出错误了。
给你两个直接可行的解决方案:
方案一:把匹配字符串转成bytes类型
直接在"https"前面加b前缀,让它变成bytes类型,这样就能和列表里的元素匹配了:
op = [b'key', b'Changes:', b'remote:', b'https://server-1.com/253', b'test', b'change', b'remote:', b'To', b'ssh://server-1:29418/a/ab', b'*', b'[new', b'branch]', b'HEAD', b'->', b'refs/for/foo'] next(x for x in op if b"https" in x)
执行后会返回b'https://server-1.com/253',这是bytes格式的结果。
方案二:把bytes元素解码成字符串
如果你之后需要用字符串格式的URL,可以把列表里的bytes元素解码成str再判断:
next(x.decode('utf-8') for x in op if "https" in x.decode('utf-8'))
这个方法会返回字符串类型的'https://server-1.com/253',注意解码时用的utf-8是通用编码,如果你的数据有特殊编码,要换成对应的编码格式。
小提醒:以后碰到bytes和str的操作,一定要先统一两者的类型,要么把str转成bytes,要么把bytes解码成str,就不会再踩这个类型不匹配的坑啦。
内容的提问来源于stack exchange,提问作者rodee
相关产品推荐
相关产品推荐

