python标准数据类型Bytes
预备知识:
bin():
"""
Return the binary representation of an integer.
>>> bin(2796202)
'0b1010101010101010101010'
"""
pass字符串长度 python
ord():
""" Return the Unicode code point for a one-character string. """
bytes类
"""
bytes(iterable_of_ints) -> bytes
bytes(string, encoding[, errors]) -> bytes
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
bytes(int) -> bytes object of size given by the parameter initialized with null bytes
bytes() -> empty bytes object
Construct an immutable array of bytes from:
- an iterable yielding integers in range(256)
- a text string encoded using the specified encoding
- any object implementing the buffer API.
-
an integer
"""
python3中,字符串是unicode格式,字节包括utf-8,gbk等等,⽹络传输,硬盘保存是以字节格式保存的。
str和bytes格式的区别:
str:
表现形式:a='hello,world'
内部原理:00000000 00000000 00000000 01101000 ‘h’
。。。
。。。
bytes:
表现形式:a=b'hello,world'
内部原理:
01101000 utf-8
。。。
。。。
00000000 01101000 gbk
。。。
。。。
Bytes 对象是由单个字节作为基本元素(8位,取值范围 0-255)组成的序列,为不可变对象。
Bytes 对象只负责以⼆进制字节序列的形式记录所需记录的对象,⾄于该对象到底表⽰什么(⽐如到底是什么字符)则由相应的编码格式解码所决定。我们可以通过调⽤ bytes() 类(没错,它是类,不是函数)⽣成 bytes 实例,其值形式为 b'xxxxx',其中 'xxxxx' 为⼀⾄多个转义的⼗六进制字符串(单个 x 的形式为:\xHH,其中 \x 为⼩写的⼗六进制转义字符,HH 为⼆位⼗六进制数)组成的序列,每两个⼗六
进制数即每个‘x’代表⼀个字节(⼋位⼆进制数,取值范围 0-255),对于同⼀个字符串如果采⽤不同的编码⽅式⽣成 bytes 对象,就会形成不同的值。
3最重要的新⼤概要算是对⽂本和作了更为清晰的区分。⽂本总是,由str类型表⽰,⼆进制数据则由bytes类型表⽰。Python 3不会以任意隐
式的⽅式混⽤str和bytes,正是这使得两者的区分特别清晰。你不能拼接和字节包,也⽆法在字节包⾥字符串(反之亦然),也不能将字符串传⼊为字节包的(反之亦然)。
例如:
a='你好'
a_de('utf-8')
print(a_b)
for i in a_b:
print(i)
for i in a_b:
print(bin(i))
输出:
b'\xe4\xbd\xa0\xe5\xa5\xbd' #原来如此,\xe4 长得这么丑,实际是⼗六进制的数字。和128,12,没什么本质的区别。⾃然就可以bin()变为⼆进制数字了。
228
189
160
229
165
189
0b11100100
0b10111101
0b10100000
0b11100101
0b10100101
0b10111101
回到bytes和str的⾝上。bytes是⼀种⽐特流,它的存在形式是010********这种。我们⽆论是在写代码,还是阅读⽂章的过程中,肯定不会有⼈直接阅读这种⽐特流,它必须有⼀个编码⽅式,使得它变成有意义的⽐特流,⽽不是⼀堆晦涩难懂的01组合。因为编码⽅式的不同,对这个⽐特流的解读也会不同,对实际使⽤造成了很⼤的困扰。下⾯让我们看看Python是如何处理这⼀系列编码问题的:
>>> s = "中⽂"
>>> s
'中⽂'
>>> type(s)
<class 'str'>
>>> b = bytes(s, encoding='utf-8')
>>>b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>
从例⼦可以看出,s是个字符串类型。Python有个内置函数bytes()可以将字符串str类型转换成bytes类型,b实际上是⼀串01的组合,但为了在ide环境中让我们相对直观的观察,它被表现成了b'\xe4\xb8\xad\xe6\x96\x87'这种形式,开头的b表⽰这是⼀个bytes类型。\xe4是⼗六进制的表⽰⽅式,它占⽤1个字节的长度,因此”中⽂“被编码成utf-8后,我们可以数得出⼀共⽤了6个字节,每个汉字占⽤3个,这印证了上⾯的论述。在使⽤内置函数bytes()的时候,必须明确encoding的参数,不可省略。
我们都知道,字符串类str⾥有⼀个encode()⽅法,它是从字符串向⽐特流的编码过程。⽽bytes类型恰好有个decode()⽅法,它是从⽐特流向字符串解码的过程。除此之外,我们查看Python源码会发现bytes和str拥有⼏乎⼀模⼀样的⽅法列表,最⼤的区别就是encode和decode。
从实质上来说,字符串在磁盘上的保存形式也是01的组合,也需要编码解码。
如果,上⾯的阐述还不能让你搞清楚两者的区别,那么记住下⾯两⼏句话:
1. 在将字符串存⼊磁盘和从磁盘读取字符串的过程中,Python⾃动地帮你完成了编码和解码的⼯作,你不需要关⼼它的过程。
2. 使⽤bytes类型,实质上是告诉Python,不需要它帮你⾃动地完成编码和解码的⼯作,⽽是⽤户⾃⼰⼿动进⾏,并指定编码格式。
3. Python已经严格区分了bytes和str两种数据类型,你不能在需要bytes类型参数的时候使⽤str参数,反之亦然。这点在读写磁盘⽂件时容
易碰到。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论