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]: True

In [2]: 'a' in u'a'Out[2]: True

In [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]: False

In [4]: '编程' in u'编程'---------------------------------------------------------------------------UnicodeDecodeError Traceback (most recent call last)

in ()

----> 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]: False

In [2]: 'a' in b'a'---------------------------------------------------------------------------TypeError Traceback (most recent call last)

in ()

----> 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之间的转换

一图胜千言:

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]: a

Out[17]: 'T恤'In [18]: len(a)

Out[18]: 2In [19]: b = a.encode('utf8')

In [20]: b

Out[20]: b'T\xe6\x81\xa4'In [21]: a == b

Out[21]: FalseIn [22]: c = a.encode('gbk')

In [23]: c

Out[23]: b'T\xd0\xf4'In [24]: b == c

Out[24]: FalseIn [25]: a == c

Out[25]: False

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

In [29]: img = open('str-bytes.jpg', 'rb').read()

In [30]: type(img)

Out[30]: bytes

In [31]: img.decode('utf8')

---------------------------------------------------------------------------

UnicodeDecodeError Traceback (most recent call last)

in ()----> 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)

in ()

----> 1 open('z.txt', 'w').write(img)

TypeError: write() argument must be str, not bytes

In [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

python3字符编码str_聊聊Python 3 的字符串:str 和 bytes 的区别相关推荐

  1. Python2和python3字符编码的区别

    Python2和python3字符编码的区别 一.字符编码应用值Python 1. 执行Python程序的三个阶段 Python test.py(执行test.py的第一步,一定是先将文件内容从硬盘读 ...

  2. python3字符编码与文件处理终极版

    python3字符编码与文件处理 1. 什么是编码 ASCII GB2312 GBK 和 GB18030 UNICODE utf8 Unicode与utf8的关系 拓展:utf8是如何节约硬盘和流量的 ...

  3. python3 gb2312转utf8_python2和python3字符编码 unicode,utf-8,gb2312相互转换encode,decode...

    一.预习: 1.Unicode 和utf-8之间的关系 unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk -- UTF-8是Unicode的实现方式之一 2.pyth ...

  4. 关于python字符编码_关于python文件的字符编码

    # -*- coding: utf-8 -*-字符编码是啥? 在弄清楚字符编码是啥之前我们要先考虑一个问题.如果计算机最基础的就是0和1,那么他们是如何识别我们输入的英文字母和数字的. 下面是数学知识 ...

  5. Python中int、str、bytes相互转化,还有2进制、16进制表示,你想要的都在这里了

    文章目录 前言 数据类型转化 int -> str 使用 str() 函数 使用 format() 函数 使用 hex() 转换成16进制形式 使用 bin() 转换成2进制形式 str -&g ...

  6. python3 字符串str和bytes的相互转换

    1.相关基础(python3中有两种字符串类型:str和bytes) python编码问题大终结 - 看雪. - 博客园 str以unicode编码格式保存在内存 所以使用时,不用管前面要不要加u ( ...

  7. str在python中是什么数据类型_3、python数据类型之字符串(str)

    字符串是任何计算机语言中最常见的数据类型,python中也不例外,因此熟练掌握字符串是学习python的必备技能. python中字符串三种定义方式 str = 'wang' str = " ...

  8. python3字符编码错误

    在3.x 这里返回的是bytes-like类型, 所以这里不需要释放编码 ,释放也没有意义, 而是应该encode 转换成我们需要的编码, 之所会造成类型错误,原因是就在这里. 他们返回的类型不一样, ...

  9. day2 字符编码、列表、元组、字符串操作、字典

    文章目录 1.三元运算与字符串编码转换 2.列表.元组操作 3.字符串操作 4.字典操作 1.三元运算与字符串编码转换 三元运算 a,b,c = 1,3,5 d = a if a > b els ...

最新文章

  1. Ubuntu 系统通过终端打开AndroidStudio工具
  2. 两款接口测试工具推荐
  3. 无根树转有根树的一般方法
  4. MybatisPlus实现分页
  5. Kubernetes资源创建yml语法
  6. vcpkg安装_微软牌包管理器vcpkg更新及路线图计划
  7. 环境搭建:Windows系统下Nacos集群搭建
  8. 利用批处理查看dll中的函数
  9. DBeaver-调整字体
  10. 使用Visual Studio编译Geos
  11. 如何php实现即时到账,paypal即时到账php实现代码-PHPphp技巧
  12. 算法(字符串)——重复的子字符串
  13. MySQL之between and 临界值问题
  14. 安徽农商行计算机类笔试考什么,2019安徽农商行社会招聘:笔试考什么?如何复习? 【附带笔试模拟题】...
  15. 2020-11-21
  16. CentOS Docker使用ELK监听日志
  17. mysql 1142 问题解决
  18. ajax从服务器获取图片,JQuery ajax与POST从CORS启用服务器获取图像/ png
  19. StatusBarUtil 状态栏工具类(实现沉浸式状态栏/变色状态栏)
  20. win下bat批量重命名文件

热门文章

  1. 常见服务器小机型号,小机服务器一览.ppt
  2. mysql ab复制_实现mysql的ab复制(a-b-b,a-b-c)
  3. Python内置函数——eval、exec、compile
  4. 5分钟了解 Python 中的super函数是如何实现继承的
  5. python调用shell命令之三慷慨法
  6. C语言函数strcmp()(比较两个字符串)
  7. visual studio C语言指针提示:使用未初始化的内存xx
  8. 双缝干涉试验为什么恐怖?
  9. yunyang1994 tensorflow_yolov3 对于检测中心点的边缘物体时评估IOU对召回率和精度的影响
  10. tensorflow tf.is_gpu_available() (判断GPU是否可用)