python3.2的bytes和str数据拼接

来源:互联网 发布:大数据培训学校 编辑:程序博客网 时间:2024/05/17 06:18

最近看到一个python的socket编程编码问题,就研究一下python socket编程。

直接拷贝网上示例,发现:python平台2.X可以运行,python3.X居然运行不通过。


网上搜索到原因:Python 3最对文本和二进制数据作了更为清晰的区分。

“文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。”


问题描述

以下红色部分的代码:f.read的结果是二进制数据,在python3.x中不能直接和str字符串连接。

# Read picture, put into HTTP formatf = open(r'F:\python-s\helloworld\test.jpg','rb')pic_content = '''HTTP/1.x 200 OK  Content-Type: image/jpg'''pic_content = pic_content + f.read()f.close()

解决方法
全转二进制流:
pic_content = bytes(pic_content,'utf-8') + f.read()。客户端成功解析出图片。成功。
此处不考虑全转字符串:
因为:pic_content = pic_content + str(f.read())
得到的pic_content是一个分离的字符串(http头和image内容分离了),客户端解析不出。失败。

p.s. 记录一下遇到的问题:

错误一:TypeError: Can't convert 'bytes' object to str implicitly  

# Read picture, put into HTTP formatf = open(r'F:\python-s\helloworld\test.jpg','rb')pic_content = '''HTTP/1.x 200 OK  Content-Type: image/jpg'''pic_content = pic_content + f.read()f.close()
错误原因:不能直接拼接字符串和二进制流

错误二:TypeError: Type str doesn't support the buffer API

request=conn.recv(1024)
method=request.split(' ')[0]

错误原因:recv函数结果需要转码。添加request = request.decode('utf-8')再对request进行操作。
错误三:IndentationError: unexpected indent

错误原因:该行未对齐。


0 0
原创粉丝点击