请教Python3 bytearray 的问题

发布网友

我来回答

2个回答

懂视网

python3对文本和二进制数据做了区分。文本是Unicode编码,str类型,用于显示。二进制类型是bytes类型,用于存储和传输。bytes是byte的序列,而str是unicode的序列。本文主要介绍了python string类型 bytes类型 bytearray类型,需要的朋友可以参考下,希望能帮助到大家。

一、str类型:

 >>> s = u'你好'
 >>> s
 '你好'
 >>> type(s)
 <class 'str'>

bytes类型:

 >>> b = b'abc'
 >>> b
 b'abc'
 >>> type(b)
 <class 'bytes'>

二、str和bytes之间的转换关系:str-->encode()-->bytes-->decode()-->str

转换方式一:encode(),decode()

 >>> a = u'你好'
 >>> b = a.encode('utf-8')
 >>> b
 b'xe4xbdxa0xe5xa5xbd'
 >>> type(b)
 <class 'bytes'>
 >>> new_a = b.decode('utf-8')
 >>> new_a
 '你好'
 >>> type(new_a)
 <class 'str'>

转换方式二:bytes(),str()

 >>> a = u'你好'
 >>> b= bytes(a, encoding='utf-8')
 >>> b 
 b'xe4xbdxa0xe5xa5xbd'
 >>> type(b)
 <class 'bytes'>
 >>> new_a = str(b, encoding='utf-8')
 >>> new_a
 '你好'
 >>> type(new_a)
 <class 'str'>

三、bytearray类型

bytearray类是range 0 < = x < 256的一个可变序列。

可选的源参数可以用几种不同的方式来初始化数组:

?如果它是一个字符串,那么您还必须给出编码(以及可选的错误)参数;bytearray()然后使用str.encode()将字符串转换为字节。
?如果它是一个整数,那么数组将具有这个大小,并将用null字节初始化。
?如果它是符合缓冲区接口的对象,则将使用对象的只读缓冲区来初始化字节数组。
?如果它是可迭代的,那么它必须是range 0 < = x < 256的整数的迭代,它被用作数组的初始内容
?如果没有参数,则创建一个大小为0的数组。

当源参数是一个字符串时:

 >>> b = bytearray(u'你好', encoding='utf-8')
 >>> b
 bytearray(b'xe4xbdxa0xe5xa5xbd')
 >>> type(b)
 <class 'bytearray'>

当源参数是一个整数时:

 >>> b = bytearray(5)
 >>> b
 bytearray(b'x00x00x00x00x00')
 >>> type(b)
 <class 'bytearray'>

当源参数是一个可迭代对象,那么这个迭代对象的元素都必须符合0 <= x < 256:

 >>> b = bytearray([1, 2, 3, 4, 255])
 >>> b
 bytearray(b'x01x02x03x04xff')
 >>> type(b)
 <class 'bytearray'

四、bytes和bytearray区别

bytes是不可变的,同str。bytearray是可变的,同list。

 >>> b = bytearray()
 >>> b
 bytearray(b'')
 >>> b.append(10)
 >>> b
 bytearray(b'
')
 >>> b.append(100)
 >>> b
 bytearray(b'
d')
 >>> b.remove(100)
 >>> b
 bytearray(b'
')
 >>> b.insert(0, 150)
 >>> b
 bytearray(b'x96
')
 >>> b.extend([1, 3, 5])
 >>> b
 bytearray(b'x96
x01x03x05')
 >>> b.pop(2)
 1
 >>> b
 bytearray(b'x96
x03x05')
 >>> b.reverse()
 >>> b
 bytearray(b'x05x03
x96')
 >>> b.clear()
 >>> b
 bytearray(b'')

五、bytes和 bytearray转换

 >>> b = b'abcdef'
 >>> bay = bytearray(b)
 >>> bay
 bytearray(b'abcdef')
 >>> b = bytes(bay)
 >>> b
 b'abcdef'

六、bytearray和str转换

 >>> a = 'abcdef'
 >>> b = bytearray(a, encoding='utf-8')
 >>> b
 bytearray(b'abcdef')
 >>> a = b.decode(encoding='utf-8')
 >>> a
 'abcdef'

热心网友

以前在 python2 中 a=bytes(bytearray((182,)))结果是 a='\xb6'
现在在 Python3 运行结果是 a=b'\xb6',尝试各种 a.decode()均失败了,请问如何能在 Python3 得到和 Python2 一样的结果呢?

1. Python3 里面的 str 已经是 unicode str 了。
2. bytes(bytearray((182,)))你用的就是 bytes 函数,所以理所当然的,无论 py2 还是 py3 都返回 bytes 类型,只不过 py2 时 bytes==str 而已。
3. 如果你想得到的是 latin_1 编码的\xb6 代表的 str,请用.decode('latin-1')

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com