Python 3中bytes和str的分别

最近把一段py2的代码转换到py3的代码,结果运行到向socket中写数据的代码部分出现了'str' does not support the buffer interface这样一个错误.

一番搜索之后,发现py3里是严格区分了str和bytes的.怎么理解str和bytes呢?你可以认为str是一段文本,比如“abcd#%$^*&”什么的,而bytes呢,是二进制的一堆0,1的比特而已.看下面的图:

可以看到str的类型是class 'str',而str.encode()以后类型是class 'bytes',这二者是不同的.而str.encode(‘gbk’)和str.encode('utf-8')得到的bytes的表示也是不同的.也就是说在采用不同的编码时,对同样的文本“哈哈”而言,其在内存中的那一堆01是不一样的.

str和bytes之间可以通过encode(),decode()相互转化.

下面是Python34\Lib\socket.py中的一段代码,可以看到在py3中,向一个socket file中写数据必须写的是bytes或是bytearray类型的

 1    def write(self, b):
 2         """Write the given bytes or bytearray object *b* to the socket
 3         and return the number of bytes written.  This can be less than
 4         len(b) if not all data could be written.  If the socket is
 5         non-blocking and no bytes could be written None is returned.
 6         """
 7         self._checkClosed()
 8         self._checkWritable()
 9         try:
10             return self._sock.send(b)
11         except error as e:
12             # XXX what about EINTR?
13             if e.args[0] in _blocking_errnos:
14                 return None
15             raise

所以在send(content)的时候如果content类型不是bytes或bytearray而是str的话就会出现'str' does not support the buffer interface的问题.将send(content)修正为send(content.encode())就好啦.

 

转载于:https://www.cnblogs.com/sdu20112013/p/4140748.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值