iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >聊聊Python 3 的字符串:str 和 bytes 的区别
  • 776
分享到

聊聊Python 3 的字符串:str 和 bytes 的区别

2023-06-02 08:06:39 776人浏览 薄情痞子

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

摘要

python2的字符串有两种:str 和 unicode,python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2

python2的字符串有两种:str 和 unicode,python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。

Python2里面的str和unicode是可以混用的,在都是英文字母的时候str和unicode没有区别。而Python3 严格区分文本(str)和二进制数据(bytes),文本总是unicode,用str类型,二进制数据则用bytes类型表示,这样严格的限制也让我们对如何使用它们有了清晰的认识,这是很棒的。

Python2 和 Python3 的区别

通过以下代码我们认识以下Python2和Python3的字符串混用情况:

# Python2中:In [1]: 'a' == u'a'Out[1]: TrueIn [2]: 'a' in u'a'Out[2]: TrueIn [3]: '编程' == u'编程'/usr/local/bin/ipython:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal#!/usr/bin/pythonOut[3]: FalseIn [4]: '编程' in u'编程'---------------------------------------------------------------------------UnicodeDecodeError Traceback (most recent call last)<ipython-input-4-7b677a923254> in <module>()----> 1 '编程' in u'编程'UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)# Python3中:In [1]: 'a' == b'a'Out[1]: FalseIn [2]: 'a' in b'a'---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-10-ca907fd8856f> in <module>()----> 1 'a' in b'a'TypeError: a bytes-like object is required, not 'str'

以上代码可以看到,Python2中str和unicode的在都是ascii码时混用没区别,因为unicode的ascii区域的值跟str的ascii是一样的;而对应非ascii区域(比如中文),二者又不一样了,可以看到Python2抛出了UnicodeDecodeError的异常,相信这也是很多人处理文本时遇到过的错误;‘编程’在str类型时长度是6,而在unicode时是2。不同字符的不同表现,让Python2的str和unicode显得扑朔迷离。

在Python3中,严格区分了str和bytes,不同类型之间操作就会抛出TypeError的异常。

上面用示例阐述了Python2和Python3中字符串的不同,下面主要讲Python3中的字符串。

str和bytes之间的转换

一图胜千言:

聊聊Python 3 的字符串:str 和 bytes 的区别

str和bytes的相互转换

str.encode(‘encoding’) -> bytes

bytes.decode(‘encoding’) -> str

encoding 指的是具体的编码规则的名称,对于中文来说,它可以是这些值: ‘utf-8’, ‘gb2312’, ‘gbk’, ‘big5’ 等等。

不知道你有没有注意到上图中str矩形要比bytes矩形短,表示同样的内容,str的长度要小于或等于bytes的长度,你可以考虑一下原因(参考Unicode、UTF-8的编码规则)

下面看看具体代码理解一下str和bytes的相互转换:

In [16]: a = 'T恤'In [17]: aOut[17]: 'T恤'In [18]: len(a)Out[18]: 2In [19]: b = a.encode('utf8')In [20]: bOut[20]: b'T\xe6\x81\xa4'In [21]: a == bOut[21]: FalseIn [22]: c = a.encode('gbk')In [23]: cOut[23]: b'T\xd0\xf4'In [24]: b == cOut[24]: FalseIn [25]: a == cOut[25]: False

上面str和bytes之间的转换是针对文本内容的,要是其它二进制内容(比如,图片)时,bytes就不能decode成str了,看以下代码的异常:

In [29]: img = open('str-bytes.jpg', 'rb').read()In [30]: type(img)Out[30]: bytesIn [31]: img.decode('utf8')---------------------------------------------------------------------------UnicodeDecodeError Traceback (most recent call last)<ipython-input-31-c9e28f45be95> in <module>()----> 1 img.decode('utf8')UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

因为图片中的二进制数据不符合文本数据的UTF-8编码规则。

上面获得图片数据时,我们用到了open()来读取文件,文件存储的无非是文本和二进制这两种格式,读写文件时也有分清楚编码:

In [32]: open('z.txt', 'w').write('T恤')Out[32]: 2In [33]: open('z.txt', 'w').write(img)---------------------------------------------------------------------------TypeError Traceback (most recent call last)<ipython-input-33-4a88980b3a54> in <module>()----> 1 open('z.txt', 'w').write(img)TypeError: write() argument must be str, not bytesIn [34]: open('z.txt', 'wb').write(img)Out[34]: 12147

读写二进制数据(如图片)时,要加’rb’参数,b代码binary(二进制)

读写文本数据时,一般加’b’,open()会自动转换bytes到str。

总结一下

Python3里面的str是在内存中对文本数据进行使用的,bytes是对二进制数据使用的。

str可以encode为bytes,但是bytes不一定可以decode为str。实际上bytes.decode(‘latin1’)可以称为str,也就是说decode使用的编码决定了decode()的成败,同样的,UTF-8编码的bytes字符串用GBK去decode()也会出错。

bytes一般来自网络读取的数据、从二进制文件(图片等)读取的数据、以二进制模式读取的文本文件(.txt, .html, .py, .cpp等)



文章首发于我的个人博客,同时我也在猿人学网站上写Python教程
你也可以关注我的个人公众号:猿人学Python

--结束END--

本文标题: 聊聊Python 3 的字符串:str 和 bytes 的区别

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 聊聊Python 3 的字符串:str 和 bytes 的区别
    Python2的字符串有两种:str 和 unicode,Python3的字符串也有两种:str 和 bytes。Python2 的 str 相当于 Python3 的bytes,而unicode相当于Python3的str。Python2...
    99+
    2023-06-02
  • 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
  • 聊聊git和github的区别
    Git是一种分布式版本控制系统,它能够记录代码的变化并帮助开发者管理版本的历史记录。Git的创建者是Linus Torvalds,它于2005年发布并在开源社区中推广,现在已成为开发者们最常用的版本控制工具之一。GitHub则是一个在线代码...
    99+
    2023-10-22
  • 聊聊python dropna()和notnull()的用法区别
    `dropna()`和`notnull()`是pandas库中用于处理缺失值的函数,它们的用法和功能有一些区别。`dropna()`...
    99+
    2023-08-16
    python
  • 聊聊SpringCloud和SpringCloudAlibaba的区别
    目录SpringCloud和SpringCloudAlibaba的区别SpringCloud Alibaba与Spring Cloud搭配方案开源地址SpringCloud几大痛点S...
    99+
    2024-04-02
  • Python中bytes和str的区别与联系详解
    目录Bytes和Str的区别Bytes与Str间的转换读写文件的注意事项总结Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符...
    99+
    2024-04-02
  • 聊聊@RequestMapping和@GetMapping @PostMapping的区别
    @RequestMapping和@GetMapping @PostMapping的区别 最近学习看一些代码,发现对于发送请求这件事,有的地方用@RequestMapping,有的地方...
    99+
    2024-04-02
  • 聊聊BeanUtils.copyProperties和clone()方法的区别
    目录首先,BeanUtils有两种:效率:需要在pom文件中引入这个包在pom文件里面引入所需要的包新建一个实体类StudentEntity实现Cloneable接口测试方法最近撸代...
    99+
    2024-04-02
  • 聊聊Numpy.array中[:]和[::]的区别在哪
    [:]和[::]的区别蛮大的,用的好可以节省时间,下面以实例进行分析 array([:]) >>> import numpy as np >>>...
    99+
    2024-04-02
  • 聊聊php截取中文字符串的问题
    PHP是一款广泛使用的编程语言,在开发网站与应用程序上有着广泛的应用。在PHP开发中,截取字符串是常见的需求。如果要截取中文字符串,需要一些特殊的处理。在PHP中,字符串处理函数常常用到,如substr、mb_substr,而且它们都可以用...
    99+
    2023-05-14
  • 聊聊Python与Golang的区别有哪些
    Python是一种高级编程语言,它被广泛用于数据科学、计算机科学、人工智能和互联网开发等领域。而Golang是一种新型的编程语言,也被称为Go,由Google开发,它的设计目的是为了在多核和网络环境下提供更好的性能和可伸缩性。语言设计Pyt...
    99+
    2023-05-14
  • 聊聊JavaScript和php的区别有哪些
    JavaScript和PHP是两种不同的编程语言,它们各自有着自己的特点和用途。虽然它们都可以用于Web开发,但是它们的差异还是很大的。下面将详细介绍JavaScript和PHP之间的区别。语言类型JavaScript是一种客户端脚本语言,...
    99+
    2023-05-14
  • 聊聊php提取字符串前几个字符的几种方法
    在PHP编程中,字符串操作是最常见的操作之一。有时候需要截取字符串的前几个字符,以满足程序的需求。本文将介绍PHP中如何取字符串前几个字符。PHP语言提供了多种方法来截取字符串,以下是三种最常用的方法:使用substr()函数来提...
    99+
    2023-05-14
  • 聊聊Kotlin 中 lateinit 和 lazy 的原理区别
    目录lateinit用法原理lazy用法原理the endreferences使用 Kotlin 进行开发,对于 latelinit 和 lazy 肯定不陌生。但其原理上的区别,可能...
    99+
    2024-04-02
  • 聊聊码云和gitee的区别是什么
    码云和gitee是当前国内最受欢迎的两个代码托管平台,二者许多人会认为他们是一样的,但实际上,它们在某些功能和用法方面还是存在一些差异的。下面,我们就来探讨一下码云和gitee的几个不同之处。管理者背景首先,码云和gitee的背景不同。码云...
    99+
    2023-10-22
  • 聊聊Java BigInteger里面的mod和remainder的区别
    目录BigInteger里的mod和remainder区别mod是模运算,remainder是求余运算BigInteger类的一些使用心得下面总结一下以后方便找1.给大数赋值2.把i...
    99+
    2024-04-02
  • 聊聊PHP中删除字符串的逗号和尾部斜杠的方法
    正如标题所述,本文将给大家通过两个示例来介绍PHP删除字符串中的逗号以及尾部斜杠的方法,感兴趣的朋友咱们一起继续往下看吧~ 下面我们通过具体的实例分别讲解: 第一个示例的要求则是“编...
    99+
    2024-04-02
  • 聊聊ResourceBundle和properties读取配置文件的区别
    java.util.ResourceBundle 和java.util.properties 读取配置文件区别 这两个类都是读取properties格式的文件的,而Propertie...
    99+
    2024-04-02
  • 聊聊php换行和回车的区别是什么
    PHP中有一个非常常见的问题就是,如何换行和回车。虽然在很多情况下,“回车”和“换行”看起来一样,但它们的实际意义是有所不同的。在PHP中,换行和回车的区别非常重要,它们不仅仅可以影响代码的可读性,还可能会导致一些程序错误。下面,我们来看一...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作