返回顶部
首页 > 资讯 > 后端开发 > Python >Effective Python bytes 与 str 的区别
  • 142
分享到

Effective Python bytes 与 str 的区别

2024-04-02 19:04:59 142人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1、python 有两种类型可以表示字符序列2、Unicode 数据和二进制数据转换3、使用原始的 8 位值与 Unicode 字符串3.1 问题一: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 的区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Effective Python bytes 与 str 的区别

本文链接: https://lsjlt.com/news/157351.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Effective Python bytes 与 str 的区别
    目录1、Python 有两种类型可以表示字符序列2、Unicode 数据和二进制数据转换3、使用原始的 8 位值与 Unicode 字符串3.1 问题一:bytes 和 str 的实...
    99+
    2024-04-02
  • Python中bytes与str的区别
    一、两种不同的数据类型 bytes是二进制数据,而str是Unicode文本。 在Python中,bytes是一个类型,用于代表字节串,是不可变序列,包含范围为0 <= x < 256的整数。bytes可以看做是bytearra...
    99+
    2023-10-29
    区别 Python bytes
  • Python中bytes与str有什么区别
    这期内容当中小编将会给大家带来有关Python中bytes与str有什么区别,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。bytes实例包含的是原始数据,即8位的无符号值(通常按照ASCII编码标准来显示...
    99+
    2023-06-15
  • Python中bytes和str的区别与联系详解
    目录Bytes和Str的区别Bytes与Str间的转换读写文件的注意事项总结Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符...
    99+
    2024-04-02
  • python str与bytes之间的转
      # bytes object   b = b"example"   # str object   s = "example"   # str to bytes   bytes(s, encoding = "utf8")   # b...
    99+
    2023-01-31
    python str bytes
  • 聊聊Python 3 的字符串:str 和 bytes 的区别
    Python2的字符串有两种:str 和 unicode,Python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2...
    99+
    2023-06-02
  • Python 编码处理-str与Unicode的区别
    一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,http参数等等 一运...
    99+
    2022-06-04
    区别 Python str
  • char str[] 与 char *str的区别详细解析
    复制代码 代码如下:char* get_str(void)  {      char str[] = {"abcd"}; ...
    99+
    2022-11-15
    char_str
  • python数据类型bytes 和 bytearray的使用与区别
    目录bytes 和 bytearray理解bytes 和 bytearraypython中值的表示进制转换bytes类型bytes类型转化bytes转数值bytes的方法bytear...
    99+
    2024-04-02
  • python中str和bytes相互转化的示例分析
    这篇文章主要介绍了python中str和bytes相互转化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python的数据类型有哪些python的数据类型:1. 数...
    99+
    2023-06-14
  • python中/与//的区别
    python中“/”表示为浮点数的除法,其返回结果为浮点数;而“//”表示的是整数除法,其返回结果为整数。实例:print("6 // 4 = " + str(6 // 4))print("6 / 4 =" + str(6 / 4))输出结...
    99+
    2024-04-02
  • python之 * 与** 的区别
    1.计算方面:*表示乘法       **表示指数幂运算 2.作为函数的参数: 1)调用函数时假设有函数 def test(a, b, c) test(*args):*表示传入的参数args是一个元组,把元组中的每一个元素按照次序作为参数...
    99+
    2023-01-30
    区别 python
  • Python中的 // 与 / 的区别
    通常C/C++中,"/ " 算术运算符的计算结果是根据参与运算的两边的数据决定的,比如:  6 / 3 = 2 ; 6,3都是整数,那么结果也就是整数2;  6.0 / 3.0 = 2.0 ; 6.0,3.0是浮点数,那么结果也是浮点数2...
    99+
    2023-01-31
    区别 Python
  • python与java区别
    Python和Java都是很火的编程语言,对于想学习编程的人员来说,常常被这个问题所困扰:我是该学Python还是Java呢?想要解决这个问题,还需结合自身实际情况和两种语言的特点进行分析。以下是Python和Java的区别: ...
    99+
    2015-10-05
    java入门 java
  • Python之is与==的区别
    首先看几个例子:# -*-coding=utf-8 -*- a="Hello Python" b="Hello Python" print (a is b)    #结果是:True print (a == b)    #结果是:True ...
    99+
    2023-01-31
    区别 Python
  • python append、extend与insert的区别
    最近在自学Python语言,看到向列表增加更多数据时被append(),extend(),insert()方法绕晕了。 append 和extend都只需要一个参数,并且自动添加到数组末尾,如果需要添加多个...
    99+
    2022-06-04
    区别 append python
  • python中TCP与UDP的区别
    这篇文章将为大家详细讲解有关python中TCP与UDP的区别,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比...
    99+
    2023-06-14
  • python的JSON与字典区别
    在python中,字典的输出内容跟json格式内容一样,但是字典的格式是字典,json的格式是字符串,所以在传输的时候(特别是网页)要转换使用。重要函数编码:把一个Python对象编码转换成Json字符串   json.dumps()解码:...
    99+
    2023-01-31
    字典 区别 python
  • Python中is与==判断的区别
    在 Python 中,比较两个对象(变量)是否相等,可以用 “is” 和 “==” 操作,但它俩有什么区别?什么时候用 “is”,什么时候用 “==” ?在面试时,发现不少候选人很难把这两者完全说清楚,因此...
    99+
    2022-06-04
    区别 Python
  • Python之is与==的区别详解
    Python有两个用于相等比较的运算符,“is”和“==”(等于)。在这篇文章中,我将教你们两者之间的区别,以及通过几个简单地例子说明什么时候使用它们。 当我还是一个孩子的时候,我们...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作