Effective Python(3)- 了解 bytes 与 str 的区别

  • bytes:实例包含的是原始数据,即8 位的无符号值(通常按照ASCII 编码标准来显示)
  • str:实例包含的是Unicode 码点(code point,也叫作代码点),这些码点与人类语言之中的文本字符相对应

  • 把 Unicode 数据转换成二进制数据,必须调用 str 的encode 方法(编码)

  • 把二进制数据转换成 Unicode 数据,必须调用 bytes 的decode 方法(解码)
  • 调用这些方法时,可以明确指出字符集编码,也可以采用系统默认的方案,通常是 UTF-8

该问题等价于:使用 bytes 和 str 时需要注意的两个问题

  • bytes + bytes,str + str 都是允许的
  • 但 bytes + str 会报错

但 bytes 和 str 之间用二元操作符也会报错

两个类型的实例相比较总会为 False,即使字符完全相同

两种类型的实例都可以出现在 % 操作符的右侧,用来替换左侧那个格式字符串(format string)里面的%s

但是!如果格式字符串是 bytes 类型,那么不能用 str 实例来替换其中的 %s,因为 Python 不知道这个 str 应该按照什么字符集来编码

但是!反过来却可以,如果格式字符串是 str 类型,则可以用bytes 实例来替换其中的 %s,但结果可能不是预期结果

  • 这样会让系统在 bytes 实例上面调用__repr__ 方法
  • 调用结果替换格式字符串里的 %s,因此程序会直接输出 b’blue’,而不是输出 blue

不能使用原始的 bytes

  • 报错是因为 w 模式必须以文本模式写入
  • 将模式改成 wb 即可正常写入二进制数据

  • 报错是因为 r 模式必须以文本模式读取

  • 以文本模式操纵文件句柄时,系统会采用默认的文本编码方案处理二进制数据
  • 所以,上面那种写法会让系统通过 bytes.decode 把这份数据解码成 str 字符串,再用 str.encode 把字符串编码成二进制值
  • 然而对于大多数系统来说,默认的文本编码方案是UTF-8,所以系统很可能会把 b’\xf1\xf2\xf3\xf4\xf5′ 当成 UTF-8 格式的字符串去解码,于是就会出现上面那样的错误

这样也不会有异常了

需要注意当前操作系统默认的字符集编码

Original: https://www.cnblogs.com/poloyy/p/15549664.html
Author: 小菠萝测试笔记
Title: Effective Python(3)- 了解 bytes 与 str 的区别

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/9232/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部