python3中str和bytes分开了,那么bytes与str之间到底是什么关系呢?下面从表现形式、处理方式、存储形式三个方面来阐述其区别
1. 在字符串前面加上b,就表示bytes数据类型
s1 = "hello"
b1 = b"hello" # 前面加上b让它变成bytes类型
print(s1)
print(b1)
输出
s1 = "hello"
b1 = b"hello" # 前面加上b让它变成bytes类型
print(s1)
print(b1)
2. 字符串是以字符为单位进行处理的,bytes类型是以字节为单位处理的。
python3中bytes类型主要用于网络传输和硬盘存储,是以字节为单位处理的
3. 字符串的编码方法只能是Unicode,bytes可以是gbk,utf-8或其他非Unicode形式。bytes类型只负责以二进制字节序列的形式记录信息,至于该二进制序列表示什么信息(比如到底是什么字符)由编码形式决定
python3中对str和bytes做了严格区分,文本总是用str类型表示,编码方式是Unicode,二进制数据则用bytes类型表示。下麦呢来看一段代码
s = "hello中国"
b = s.encode("utf-8")
print(b)
for i in b: # bytes类型也是可迭代对象,是不是很神奇
print(i)
for i in b:
print(bin(i))
输出
b'hello\xe4\xb8\xad\xe5\x9b\xbd'
104
101
108
108
111
228
184
173
229
155
189
0b1101000
0b1100101
0b1101100
0b1101100
0b1101111
0b11100100
0b10111000
0b10101101
0b11100101
0b10011011
0b10111101 Process finished with exit code 0
bytes实际上是一串0和1的组合,但为了在ide环境中让我们相对直观的观察,它被表现成了b'\xe4\xb8\xad\xe6\x96\x87'
这种形式,开头的b
表示这是一个bytes
类型。\xe4
是十六进制的表示方式,它占用1个字节的长度。bytes
是一种比特流,它的存在形式是01010001110这种。我们无论是在写代码,还是阅读文章的过程中,肯定不会有人直接阅读这种比特流,它必须有一个编码方式,使得它变成有意义的比特流,而不是一堆晦涩难懂的01组合。
字符串有一个encode()方法,与bytes的decode方法相对应,利用这两个方法可以实现字符串与bytes类型的转化
s1 = "hello"
b1 = s1.encode("utf-8")
print(b1)
s2 = b1.decode("utf-8")
print(s2)
输出
b'hello'
hello Process finished with exit code 0
还有一种方法,就是利用调用bytes()类和str()类来完成转化
b1 = bytes(s1, encoding="utf-8")
print(b1)
s2 = str(b1, encoding="utf-8")
print(s2)
输出‘
b'hello'
hello Process finished with exit code 0
实际上,我们知道,所有数据包括字符串,存储到硬盘上都是以0101的形式,也都需要编码解码。关于bytes和str,只需记住这几句话: