TypeError: can only concatenate str (not bytes) to str

背景

最近原来运行的好好的代码突然异常了,检查下日志,发现有如下的报错:

1
2
3
4
Traceback (most recent call last):
File "run.py", line 69, in send_mail_attachment
logging.info(str(response.status_code) + ':' + response.body)
TypeError: can only concatenate str (not "bytes") to str

思路

从报错上看,是由于类型不匹配导致的。

在用python发请求时,response.status_code返回的是int类型的,通过用来判断返回是否正常:

1
2
3
4
5
6
if response.status_code == 200:
# 返回正常
pass
else:
# 返回异常
pass

所以在输出字符串的时候,前面加了str()用来前强制转换成str类型。

那么问题应该就出在response.body上了,正常情况response.body返回应该是字符串,但根据提示,实际上是一个bytes类型数据。

对实际程序进行调试看下输出:

image-20190519141741966

果然body输出变成了bytes类型。

结论

定位了问题,那么该如何转换呢?

  • 通过str()转换

    上面返回是个空值,那么我们也强制转换看下:

    image-20190519142345640

    1
    2
    3
    body = b''
    str(body)
    "b''"

    强制转换之后,虽然变成了str类型,但会有前缀b'',虽然不会报错,但明显不是我们想要的。

  • 通过decode()转换

    那么编码问题,就尝试用编码解码来解决了。我们用decode()试下:

    image-20190519142532026

    1
    2
    body.decode()
    ''

    这次就对了。

至于请求的返回结果以前是str类型,现在变成了bytes类型,这就不纠结了,毕竟网络瞬息万变,还是要多用多总结。