Effective Python bytes 与 str 的区别

 更新时间:2021年11月15日 14:20:27   作者:小菠萝  
这篇文章主要介绍了Effective Python bytes 与 str 的区别,Python 有两种类型可以表示字符序列,下面围绕Python bytes 与 str 的相关资料展开内容,需要的朋友可以参考一下

1、Python 有两种类型可以表示字符序列

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

a = 'a\\u300 propos'
print(list(a))
print(a)


# 输出结果
[104, 101, 49, 49, 111]
b'he11o'

['a', '\\', 'u', '3', '0', '0', ' ', 'p', 'r', 'o', 'p', 'o', 's']
a\u300 propos

2、Unicode 数据和二进制数据转换

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

3、使用原始的 8 位值与 Unicode 字符串

使用原始的 8 位值与 Unicode 字符串时需要注意的两个问题:

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

3.1 问题一:bytes 和 str 的实例互不兼容

使用 + 操作符:

# bytes+bytes
print(b'a' + b'1')

# str+str
print('b' + '2')


# 输出结果
b'a1'
b2


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

#

 bytes+str
print('c' + b'2')


# 输出结果
print('c' + b'2')
TypeError: can only concatenate str (not "bytes") to str

同类型之间也可以用二元操作符来比较大小

assert b'c' > b'a'

assert 'c' > 'a'

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

assert b'c' > 'a'


# 输出结果
    assert b'c' > 'a'
TypeError: '>' not supported between instances of 'bytes' and 'str'

判断 bytes str 实例是否相等
两个类型的实例相比较总会为 False,即使字符完全相同

# 判断 str、bytes
print('a' == b'a')


# 输出结果
False

格式化字符串中的 %s

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

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

# %
print(b'red %s' % 'blue')


# 输出结果
    print(b'red %s' % 'blue')
TypeError: %b requires a bytes-like object, or an object that implements __bytes__, not 'str'


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

# % 
print('red %s' % b'blue')


# 输出结果
red b'blue'

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

3.2问题二:操作文件句柄时需要使用 Unicode 字符串操作

不能使用原始的 bytes

向文件写入二进制数据会报错:

# 写入二进制数据
with open('test.txt', "w+") as f:
    f.write(b"\xf1\xf2")


# 输出结果
    f.write(b"\xf1\xf2")
TypeError: write() argument must be str, not bytes


  • 报错是因为 w 模式必须以 文本 模式写入
  • 将模式改成 wb 即可正常写入二进制数据
with open('test.txt', "wb") as f:
    f.write(b"\xf1\xf2")
读取文件中二进制数据
with open('test.txt', "r+") as f:
    f.read()


# 输出结果
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: invalid continuation byte
 

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

将模式改成 rb 即可正常读取二进制数据:

with open('test.txt', "rb") as f:
    print(b"\xf1\xf2" == f.read())


# 输出结果
True


另一种改法,设置 encoding 参数指定字符串编码:

with open('test.txt', "r", encoding="cp1252") as f:
    print(f.read())


# 输出结果
ñò


这样也不会有异常了

需要注意:当前操作系统默认的字符集编码,Python 一行代码查看当前操作系统默认的编码标准

在 cmd 中执行:

> python3 -c 'import locale; print(locale.getpreferredencoding())'
UTF-8

到此这篇关于Effective Python bytes 与 str 的区别的文章就介绍到这了,更多相关Python bytes 与 str 的区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python验证码识别实例代码

    python验证码识别实例代码

    这篇文章主要介绍了python验证码识别实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • Python multiprocessing 进程间通信方式实现

    Python multiprocessing 进程间通信方式实现

    本文主要介绍了Python multiprocessing 进程间通信方式实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • ipython jupyter notebook中显示图像和数学公式实例

    ipython jupyter notebook中显示图像和数学公式实例

    这篇文章主要介绍了ipython jupyter notebook中显示图像和数学公式实例,具有很好的参考价值,希望对有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • PyCharm最新激活码PyCharm2020.2.3有效

    PyCharm最新激活码PyCharm2020.2.3有效

    这篇文章为大家提供了PyCharm最新激活码PyCharm2020.2.3有效,需要的朋友可以参考下
    2020-11-11
  • 低版本中Python除法运算小技巧

    低版本中Python除法运算小技巧

    这篇文章主要介绍了低版本中Python除法运算小技巧,python 2.5版本中存在两种除法运算,即所谓的true除法和floor除法,本文讲解了两种方法的使用技巧,需要的朋友可以参考下
    2015-04-04
  • Python中的main函数与import用法

    Python中的main函数与import用法

    这篇文章主要介绍了Python中的main函数与import用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python批量修改图片大小的方法

    python批量修改图片大小的方法

    这篇文章主要为大家详细介绍了python批量修改图片大小的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Django中F函数的使用示例代码详解

    Django中F函数的使用示例代码详解

    这篇文章主要介绍了Django中F函数的使用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG

    Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG

    这篇文章主要介绍了Python selenium 实例之通过 selenium 查询禅道是否有任务或者BUG的相关资料,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • pytorch 如何用cuda处理数据

    pytorch 如何用cuda处理数据

    考虑到各种运算只能在cpu或者gpu运算,不能混和运算,本文介绍常用的几种把数据挪到gpu或者直接在gpu创建数据再进行运算的方法
    2021-06-06

最新评论