Python中的Bytes类型与Bytes()方法

Bytes是Python3中用于存储原始字节数据的数据类型,常用于网络编程和二进制文件处理。Bytes对象可以通过在字符串前加b进行定义,但仅支持ASCII字符。创建包含非ASCII字符如中文的Bytes对象需使用bytes()函数并指定编码方式,如UTF-8。Bytes与str之间的转换需用到decode()和encode()方法,非ASCII字符解码时必须指定正确的编码方式,否则会导致错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python3中新增了Bytes数据类型,即保存原始的字节(二进制数据)。因此,Bytes类型可以运用于网络编程,也可以用于存储视频或音乐等文件。

也就是说,Bytes类型只是以二进制形式存储数据,而用户以什么解码方式读取数据是需要额外指定的,也因此我们在操作Bytes类型数据时必须指定一种解码方式。

如何定义Bytes对象?

当我们在Python中定义一个字符串时,通常使用的方法如下:

通过这两个方法,我们得到2个类型为str的字符串对象

>>> x = 'abc'
>>> y = '甲乙丙'

>>> type(x)
<class 'str'>
>>> type(y)
<class 'str'>

Bytes类型与str类型一样,都是Python内置的对象之一。Bytes类型以字节符的形式存储字符串,具体的构造方法就是在' '之前加上字母b:

此时x1的类型就是bytes了

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

但需要注意的是,以添加字母b的构造方法,仅支持ASCII码中对应的字符。例如,如果用该方法构建中文字符串,解释器就会报错:

>>> y1 = b'甲乙丙'
Traceback (  File "<interactive input>", line 1
SyntaxError: bytes can only contain ASCII literal characters.

那么如何构建类型为Bytes的中文字符串呢?可以使用Bytes()方法,使用时注意需要指定编码方式,原因是我们必须通过某种编码方式将文字转化为二进制数据储存在内存或者磁盘中,而中文(以及其它大部分非英语文字)并不在ASCII字符集的范畴之内。

这里以目前普遍适用的字符集Unicode中的utf-8编码方式为例,除此之外汉字还支持GB2312、GBK等字符集。

>>> y1 = bytes(y,'utf-8')
>>> type(y1)
<class 'bytes'>

通过以上操作我们便得到了x,y(str类型)和x1,y1(bytes类型)这4个对象。

Byte对象与str对象的区别?

我们这里通过直接输出这4个对象来看一下区别:

>>> x
'abc'
>>> y
'甲乙丙'

>>> x1
b'abc'
>>> y1
b'\xe7\x94\xb2\xe4\xb9\x99\xe4\xb8\x99'

输出x与x1的区别仅仅是多了一个字母b,但y与y1的区别则是字符串和十六进制数据的区别了。

这是因为x中包含’abc‘三个字母,而这三个字母都是ASCII字符集中的字符,不需要指定decode解码方式即可正常读取;

但y中的 '甲乙丙' 则需要指定解码方式,否则解释器可不知道该调用哪一种解码方式去decode  '\xe7\x94\xb2\xe4\xb9\x99\xe4\xb8\x99' 这串数据。

通过decode()方法解码Bytes对象

我们可以通过调用decode()方法来验证这一点:

通过指定的utf-8解码方式,可以成功地将上面那串十六进制数据解码为“甲乙丙”字符串。同时如果以其它解码方式(以utf-16为例),则无法成功解码。因此解码以字节符存储的数据时,除ASCII码外的字符集,都必须指定解码方式,这也是为什么我们无法直接Print输出'\xe7\x94\xb2\xe4\xb9\x99\xe4\xb8\x99'的原因。

>>> y1.decode('utf-8')
'甲乙丙'

>>> y1.decode('utf-16')
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x99 in position 8: truncated data
>>> 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值