Python3的bytes/str之别

Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。这是件好事

不管怎样,字符串和字节包之间的界线是必然的,下面的图解非常重要,务请牢记于心:

字符串可以编码成字节包,而字节包可以解码成字符串。

>>>‘€20‘.encode(‘utf-8‘) b‘\xe2\x82\xac20‘>>> b‘\xe2\x82\xac20‘.decode(‘utf-8‘)‘€20‘

这个问题要这么来看:字符串是文本的抽象表示。字符串由字符组成,字符则是与任何特定二进制表示无关的抽象实体。在操作字符串时,我们生活在幸福的无知之中。我们可以对字符串进行分割和分片,可以拼接和搜索字符串。我们并不关心它们内部是怎么表示的,字符串里的每个字符要用几个字节保存。只有在将字符串编码成字节包(例如,为了在信道上发送它们)或从字节包解码字符串(反向操作)时,我们才会开始关注这点。

传入encode和decode的参数是编码(或codec)。编码是一种用二进制数据表示抽象字符的方式。目前有很多种编码。上面给出的UTF-8是其中一种,下面是另一种:

>>>‘€20‘.encode(‘iso-8859-15‘) b‘\xa420‘ >>> b‘\xa420‘.decode(‘iso-8859-15‘) ‘€20‘

编码是这个转换过程中至关重要的一部分。离了编码,bytes对象b‘\xa420‘只是一堆比特位而已。编码赋予其含义。采用不同的编码,这堆比特位的含义就会大不同:

>>> b‘\xa420‘.decode(‘windows-1255‘) ‘?20‘

据说百分之八十的金钱损失皆因使用错误的编码导致,因此务必小心谨慎。

Python3的bytes/str之别,布布扣,bubuko.com

时间: 2024-10-23 07:17:58

Python3的bytes/str之别的相关文章

小白的Python之路 day1 Python3的bytes/str之别

原文:The bytes/str dichotomy in Python 3 Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分.文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示.Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰.你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然).这是件好事. 不管怎样,字符串和字节包之间的界线是必然的,下面

python3 中bytes与str类型

python3最重要的新特性之一就是对字符串和二进制流做了明确的区分.文本总是unicode,由str类型表示用于显示.二进制则是由bytes类型表示,用于存储和传输.bytes是byte的序列,而str是unicode的序列.Python3不会以任意隐式的方式混用str和bytes,不能拼接字符串和字节流,也无法在字节流里搜索字符串(反之亦然).也不能将字符串传入参数为字节流的函数(反之亦然). str与bytes之间的转换关系:str-->encode()-->bytes--->de

Python3 中的 str 和 bytes

Python3 中的 str 和 bytes 与 Python2.X 不同,Python3.X 严格区分了 str 和 bytes 两种类型.文本为 Unicode,由 str 类型表示:二进制数据则由 bytes 表示. Python3.X 不会以任意隐式的方式混用 str 和 bytes.因此使用者不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然). 例如 Python3.X 中的socket.send()函数,如果传入未编码的字

python2 与python3中最大的区别(编码问题bytes&str

1,在python2.x 中是不区分bytes和str类型的,在python3中bytes和str中是区分开的,str的所有操作bytes都支持 python2 中 >>> s = "abcdefg" >>> b = s.encode()    #或者使用下面的方式 >>> b = b"abcdefg">>> type(b)<type 'str'> python3中     #str

Python3中bytes和HexStr之间的转换

1 Python3中bytes和HexStr之间的转换 ByteToHex的转换 def ByteToHex( bins ): """ Convert a byte string to it's hex string representation e.g. for output. """ return ''.join( [ "%02X" % x for x in bins ] ).strip() HexToByte的转换 de

python3.5 的str类型和bytes类型的转换

在python3.x里增加了bytes类型,并且对str方法进行了修改,让str类型和bytes类型可以相互转换. #!/usr/bin/env python # -*- coding:utf-8 -*- a = "哈哈" #字符串转换成字节 b = bytes(a,encoding='utf-8') print(b) b1 = bytes(a,encoding='gbk') print(b1) #将字节转换成字符 c=str(b,encoding='utf-8') print(c)

python3.x中str,bytes类型相关转化

在研究Python3.x的过程中,遇到的一个纠结了我几天的问题:总是提示"a bytes-like object is required,not 'str' " 在python3.x里增加了bytes类型,并且对str方法进行了修改,让str类型和bytes类型可以相互转换. #!/usr/bin/env python # -*- coding:utf-8 -*- a = "哈哈" #字符串转换成字节 b = bytes(a,encoding='utf-8') pr

python2与python3的bytes问题

>>> s = '编程' >>> print s 编程 >>> s '\xe7\xbc\x96\xe7\xa8\x8b' >>> 在python2中直接调用字符串的变量的话,会打印其bytes(可以理解成用16进制表示字符串的内存地址,本质还是二进制).在python2中,bytes和str是一回事. 为什么要有个bytes呢?.因为所有数据本质都是用二进制进行储存的,当传输数据的时候,要把这些数据先转换成二进制( bytes)在进行

Python3.5(四) str

class str(basestring): """ str(object='') -> string Return a nice string representation of the object. If the argument is a string, the return value is the same object. """ def capitalize(self): """ 首字母变大写 &