Python3 最重要的特性之一就是对 字符串 和 二进制字节 做了明确且严格的区分,之所以说严格,是指二者在任何情况下不能混用;

 

文本总是 Unicode,由字符串 str 表示;

二进制数据由 bytes 表示;

file1 = open('data.txt', 'r')
out1 = file1.read()
print(type(out1))       # <class 'str'>

### 以二进制方式读取
file2 = open('data.txt', 'rb')
out2 = file2.read()
print(type(out2))       # <class 'bytes'>

# print(out1 + out2)      # TypeError: must be str, not bytes

 

二者相互转换

b = b'hello'
s = 'world'

print(type(b))      # <class 'bytes'>
print(type(s))      # <class 'str'>


### btyes to str
# def __init__(self, value='', encoding=None, errors='strict')
bs1 = str(b, encoding='utf-8')

# def decode(self, *args, **kwargs)
bs2 = bytes.decode(b, encoding='utf-8')
print(type(bs1), type(bs2))         # <class 'str'> <class 'str'>


### str to bytes
# def __init__(self, value=b'', encoding=None, errors='strict')
sb1 = bytes(s, encoding='utf-8')

# def encode(self, encoding='utf-8', errors='strict')
sb2 = str.encode(s, encoding='utf-8')
print(type(sb1), type(sb2))         # <class 'bytes'> <class 'bytes'>

用图总结转换方法

 

异常 Python3--TypeError:a bytes-like object is required, not‘str’

这是 python3 的异常,python2 中并无该异常

 

出现此类问题的场景如下:

1. 文件读取或写入,是否以 'b’ 二进制方式操作,显然这种方式为 byte

2. 网络编程,是否传输 二进制 字节

 

解决思路

str 通过 encode 方法编码为 byte

encode(self, encoding='utf-8', errors='strict')

或者通过 b'' 方法

 

byte 通过 decode 方法解码为 str

decode(self, *args, **kwargs)

 

示例

复制代码
s1 = 'abc'
print(type(s1))      # <class 'str'>

s2 = s1.encode()
print(type(s2))     # <class 'bytes'>

s3 = s2.decode()
print(type(s3))     # <class 'str'>

s4 = b'123'
print(type(s4))     # <class 'bytes'>
复制代码

 

 

 

 

 

参考资料:

https://www.ituring.com.cn/article/1116