在Python 3版本中,把’xxx’和u’xxx’统一成Unicode编码,即写不写前缀u都是一样的。

在Python 3版本中,所有的字符串都是使用Unicode编码的字符串序列。

Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是 Unicode,由 str 类型表示,二进制数据则由 bytes 类型表示。Python 3 不会以任意隐式的方式混用 str 和 bytes ,你不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然),也不能将字符串传入参数为字节流的函数(反之亦然)。

# -*- coding: utf-8 -*-
"""
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
"""
import sys# 查看默认编码
print(sys.getdefaultencoding()) # utf-8b = b'\xe4\xb8\xad\xe5\x9b\xbd' # py3定义bytes使用 b = b'dfja'
print(b, type(b)) # b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
b_decode = b.decode('utf-8')
print(b_decode, type(b_decode)) # 中国 <class 'str'>s = '中国' # Python3中定义的字符串(str)默认就是 unicode字符串
print(s, type(s)) # 中国 <class 'str'>
# s1 = s.decode("utf-8") # AttributeError: 'str' object has no attribute 'decode' ← Python3中字符串不再有decode方法s2 = s.encode("gbk") # 将字符串(str)用 “gbk字符编码” 编码为 “gbk字符编码的字节”
print(s2, type(s2)) # b'\xd6\xd0\xb9\xfa' <class 'bytes'>
s22 = s2.decode('gbk') # 将 “字节串” 用 “gbk字符编码” 解码 为 “字符串(str)”
print(s22, type(s22)) # 中国 <class 'str'>s3 = s.encode("utf-8")
print(s3, type(s3)) # b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>
s33 = s.encode("utf-8").decode('utf-8')
print(s33, type(s33)) # 中国 <class 'str'>

bytes和str之间的异同
回到bytes和str的身上。bytes是一种比特流,它的存在形式是01010001110这种。我们无论是在写代码,还是阅读文章的过程中,肯定不会有人直接阅读这种比特流,它必须有一个编码方式,使得它变成有意义的比特流,而不是一堆晦涩难懂的01组合。因为编码方式的不同,对这个比特流的解读也会不同,对实际使用造成了很大的困扰。下面让我们看看Python是如何处理这一系列编码问题的:

>>> s = "中文"
>>> s
'中文'
>>> type(s)
<class 'str'>
>>> b = bytes(s, encoding='utf-8')
>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>

从例子可以看出,s是个字符串类型。Python有个内置函数bytes()可以将字符串str类型转换成bytes类型,b实际上是一串01的组合,但为了在ide环境中让我们相对直观的观察,它被表现成了b’\xe4\xb8\xad\xe6\x96\x87’这种形式,开头的b表示这是一个bytes类型。\xe4是十六进制的表示方式,它占用1个字节的长度,因此”中文“被编码成utf-8后,我们可以数得出一共用了6个字节,每个汉字占用3个,这印证了上面的论述。在使用内置函数bytes()的时候,必须明确encoding的参数,不可省略。

我们都知道,字符串类str里有一个encode()方法,它是从字符串向比特流的编码过程。而bytes类型恰好有个decode()方法,它是从比特流向字符串解码的过程。除此之外,我们查看Python源码会发现bytes和str拥有几乎一模一样的方法列表,最大的区别就是encode和decode。

从实质上来说,字符串在磁盘上的保存形式也是01的组合,也需要编码解码。

如果,上面的阐述还不能让你搞清楚两者的区别,那么记住下面两几句话:

在将字符串存入磁盘和从磁盘读取字符串的过程中,Python自动地帮你完成了编码和解码的工作,你不需要关心它的过程。

使用bytes类型,实质上是告诉Python,不需要它帮你自动地完成编码和解码的工作,而是用户自己手动进行,并指定编码格式。

Python已经严格区分了bytes和str两种数据类型,你不能在需要bytes类型参数的时候使用str参数,反之亦然。这点在读写磁盘文件时容易碰到。

在bytes和str的互相转换过程中,实际就是编码解码的过程,必须显式地指定编码格式。.

>>> b
b'\xe4\xb8\xad\xe6\x96\x87'
>>> type(b)
<class 'bytes'>
>>> s1 = str(b)
>>> s1
"b'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> type(s1)
<class 'str'>
>>> s1 = str(b, encoding='utf-8')
>>> s1
'中文'
>>> type(s1)
<class 'str'>

我们再把字符串s1,转换成gbk编码的bytes类型:

>>> s1
'中文'
>>> type(s1)
<class 'str'>
>>> b = bytes(s1, encoding='gbk')
>>> b
b'\xd6\xd0\xce\xc4'

python3 的 str bytes 区别相关推荐

  1. python 的 str bytes 区别

    在Python 3版本中,把'xxx'和u'xxx'统一成Unicode编码,即写不写前缀u都是一样的. 在Python 3版本中,所有的字符串都是使用Unicode编码的字符串序列. Python ...

  2. Python str / bytes / unicode 区别详解 - Python零基础入门教程

    目录 一.前言 二.Python str / bytes / unicode 区别 1.Python2.x 版本中 str / bytes / unicode 区别 2.Python3.x 版本中 s ...

  3. Python高能小技巧:了解bytes与str的区别

    导读:Python有两种类型可以表示字符序列:一种是bytes,另一种是str. 作者:布雷特·斯拉特金(Brett Slatkin) 来源:大数据DT(ID:hzdashuju) bytes实例包含 ...

  4. pythonunicode和str_python2 中 unicode 和 str 之间的转换及与python3 str 的区别

    在python2中字符串分为 unicode 和 str 类型 Str To Unicode 使用decode(), 解码 Unicode To Str 使用encode(), 编码 返回数据给前端时 ...

  5. Python系列(五):bytes和str的区别与联系

    Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str.bytes类型是无符号的8位值(通常以ASCII码显式),而str类型是Unicode代码点(code point ...

  6. python3 str bytes bytearray 互相转换

    在一次aes解密中,我完全弄混了str.bytes.bytearray,结果导致解密的结果不正确.在这里记录一下三者的区别和相互转化的方法. 首先str是采用Unicode编码方式的序列,主要用于显示 ...

  7. python3和Python2的区别

    print函数:(Python3中print为一个函数,必须用括号括起来:Python2中print为class) Python 2 的 print 声明已经被 print() 函数取代了,这意味着我 ...

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

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

  9. pip安装库包遇到错误:TypeError: expected str, bytes or os.PathLike object, not int 的解决方法

    1 问题描述 1.在安装python3的库包时候,遇到和os模块相关的错误:TypeError: expected str, bytes or os.PathLike object, not int, ...

最新文章

  1. mysql+存储过程+删除重复数据_mysql 存储过程 删除重复
  2. python画曲线图例-如何使用python画曲线图
  3. a,b互换,不使用中间变量
  4. 子弹短信新发布,支付宝即将入驻
  5. spark太基础了,今天聊下阿里 2 面必问的数据中台
  6. C++:指针数组理解
  7. [Godot][Blender] 通过 Blender 将 fbx 批量转为 gltf 用于 godot
  8. 协议圣经 四 rtspclient
  9. java里frame颜色_如何为Java中的窗口(JFrame)添加颜色
  10. [转载] 【RTTmicropython教程】玩转 Web 服务器
  11. Joyoshare VidiKit教程:如何将字幕添加到WMV电影中?
  12. 2006 年100 款最佳安全工具谱
  13. android小小的开发细节
  14. 中孚计算机保密玩游戏,中孚计算机保密检查
  15. 百度网盘断点续传下载工具IDM
  16. phpstudy php56 zend,phpstudy集成环境
  17. android 主题颜色意义
  18. SuperMap根据栅格数据制作专题图
  19. 如何理解界面陷阱电荷呢(interface trapped charge)和费米钉扎效应?
  20. 【MySQL】根据数据表中日期字段查询某个月每一天的数据量?查询数据表中所有日期每天的数据量?近三天每天数据量?

热门文章

  1. HDU 1695 BZOJ 2301 莫比乌斯反演
  2. Java 反射的理解
  3. 10个奇幻的HTML5和Javascript效果
  4. 正则表达式,VI,SED及shell编程2010-12-05
  5. VS Tips]Visual Studio 2008 Toolbox里控件消失(#13119)的问题
  6. SAP空格无法带出历史记录的解决办法
  7. 为工厂分配用于公司间Invoice的销售范围
  8. 如何重开固定资产会计年度
  9. 微软老毛病还没改:Win10版本多达七个 咋选?
  10. LSMW批导数据文件注意