原标题:Python 3 字符串中的 STR 和 Bytes 究竟有什么区别?

Python2的字符串有两种:str和Unicode,Python3的字符串也有两种:str和Bytes。Python2的str相当于Python3的Bytes,而Unicode相当于Python3的Bytes。

Python2里面的str和Unicode是可以混用的,在都是英文字母的时候str和unicode没有区别。

而Python3严格区分文本(str)和二进制数据(Bytes),文本总是Unicode,用str类型,二进制数据则用Bytes类型表示,这样严格的限制也让我们对如何使用它们有了清晰的认识,这是很棒的。

Python2 和 Python3 的区别

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

以上代码可以看到,Python2中str和Unicode在都是ASCII码时混用没区别,因为Unicode的ASCII区域的值跟str的ASCII是一样的;而对应非ASCII区域(比如中文),二者又不一样了。

可以看到Python2抛出了Unicode Decode Error的异常,相信这也是很多人处理文本时遇到过的错误;‘编程’在str类型时长度是6,而在Unicode时是2。不同字符的不同表现,让Python2的str和Unicode显得扑朔迷离。

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

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

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的相互转换:

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

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

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

读写二进制数据(如图片)时,要加’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里str什么意思_Python 3 字符串中的 STR 和 Bytes 究竟有什么区别?相关推荐

  1. python怎么去掉换行符_python去除字符串中的换行符

    今天写这个,要用python去除字符串中的换行符并写入文件,网上查阅,就一句代码replace("\n",""),加上之后,搞了半天,还是不对. 以上是我今天遇 ...

  2. python里else中文意思_Python循环语句中else的用法总结

    前言 本文讨论Python的for-else和while-else等语法,这些是Python中最不常用.最为误解的语法特性之一. Python中的for.while等循环都有一个可选的else分支(类 ...

  3. python字节流分割_Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)

    问题描述 最近做一个项目,是用Python进行相关的串口操作.及将相关指令通过串口发给设备,设备根据发过来的指令来做出相应的操作,所用的库是Pyserial.在最初开发时,出现的问题在于:别人给的文档 ...

  4. python字节流处理_Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)

    问题描述 最近做一个项目,是用Python进行相关的串口操作.及将相关指令通过串口发给设备,设备根据发过来的指令来做出相应的操作,所用的库是Pyserial.在最初开发时,出现的问题在于:别人给的文档 ...

  5. python判断字符串里的字符_Python检测字符串中是否包含某字符集合中的字符

    目的 检测字符串中是否包含某字符集合中的字符 方法 最简洁的方法如下,清晰,通用,快速,适用于任何序列和容器 def containAny(seq,aset): for c in seq: if c ...

  6. python字符串替换源码_Python实现字符串中某个字母的替代功能

    Python实现字符串中某个字母的替代功能 今晚想实现这样一个功能:将输入字符串中的字母 "i" 变成字母 "p".当时想的很简单,直接用for循环遍历,然后替 ...

  7. python替换字符串元素_python替换字符串中的子串图文步骤

    python替换字符串中的子串图文步骤 修改字符串本身是不可能的,因为字符串是不可变类型,只能是通过某些方法来产生它的副本.再把副本赋值给原字符串,达到类似替换的作用.这里介绍几种方法. 旧串换新串: ...

  8. python统计字符串数字个数_python统计字符串中数字个数_后端开发

    python怎么随机生成奇数_后端开发 python随机生成奇数的方法:导入random模块,使用random模块生成随机数,然后判断生成的随机数是否为奇数,若是奇数就加入列表.使用此方法得到的列表包 ...

  9. python txt提取特定数据_Python提取列表中的内容 用“python”怎么提取文件里的指定内容?...

    用"python"怎么提取文件里的指定内容? python读取文件内容的方法: 一.最方便的方法是一次性读取文件中的所有内容并放置到一个大字符串中: all_the_text = ...

最新文章

  1. Jerry眼中的SAP客户数据模型
  2. bash变量和逻辑运算
  3. android点击事件的优先级,android中进程的优先级
  4. koa2 mysql增删改查_koa2实现对mysql的增删改查函数封装
  5. gradle引入依赖:_Gradle入门:依赖管理
  6. 用JQuery中的Ajax方法获取web service等后台程序中的方法
  7. figtree如何编辑进化树_iTOL快速绘制颜值最高的进化树
  8. ps aux 命令分析
  9. java未发现数据源名称并且未指定默认驱动程序_转:java.sql.SQLException: [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称并且未指定默认驱动程序...
  10. webpack4.0各个击破(1)—— html部分
  11. 【蓝桥杯单片机】独立按键和矩阵按键
  12. 樊登36个问题建立亲密关系_心理学家亚瑟·阿伦的36个问题-樊登读书
  13. 最短路径之迪杰斯特拉算法
  14. 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛题解
  15. 一本书学会可视化设计 pdf_【推荐给设计师看的11本书】电子版PDF
  16. JZOJ【NOI2017模拟3.30】原谅
  17. Improved 3D Object Detector Under Snowfall Weather Condition Based on LiDAR Point Cloud
  18. 《文献管理与信息分析》课程笔记
  19. 没错,Linux需要更多的憎恨者
  20. 一个运维工程师必须要知道的(工作职责与应用场景)干货整理

热门文章

  1. jmeter强大的扩展插件!!
  2. Python简单的抓取静态网页内容
  3. Tracing mysqld Using DTrace
  4. 1006实验一实验报告
  5. 面向对象的思想是什么?
  6. Linux的bc命令计算π的值预估系统算力
  7. 周末生活日记|我们和楠哥
  8. 那些年,我和发哥在恒大的日子
  9. 我看完大连理工研究生的遗书之后
  10. Linux 进程管理数据结构