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和bytes是严格区分的

>>> s = "abcdefg"
>>> type(s)
<class 'str'>
>>> b = b"abcdefg"
>>> type(b)
<class 'bytes'>

str是文本系列,bytes是字节系列

文本是有编码的(UTF-8,GBK,GB2312等)

字节没有编码

文本的编码指的是字符如何使用字节来表示组织方式,linux下默认都使用UTF-8

2,bytes与str之间的转换-------编码

bytes由str通过encode方法转化得到的,str也可以通过bytes 通过decode方法转化得到

通过b前缀可以定义bytes

GBK 是双字节,UTF-8 灵活编码,1字节,2字节,3字节,4字节都有,最大支持6字节长度,中文大多数是3字节

>>> S = "我是中国人"
>>> S
'我是中国人'
>>> b = S.encode()     #进行编码为bytes
>>> b
b'\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xba'
>>> b.decode()    #进行解码为字符串
'我是中国人'
>>>

str被编码成什么格式的,就需要使用什么格式的编码进行解码

>>> S = "我是中国人"
>>> S
'我是中国人'
>>> b = S.encode('GBK')
>>> b
b'\xce\xd2\xca\xc7\xd6\xd0\xb9\xfa\xc8\xcb'
>>> b.decode('GBK')
'我是中国人'

可以使用bin( )将一个10进制整数或者16进制数转化为2进制

>>> bin(10)
'0b1010'
>>>

>>> bin(0xce)
'0b11001110'

3,bytes的操作

bytes具有string类型的所有操作,bytes可以通过str encode转化,也可以通过前缀b定义

>>> b = b'abc'
>>> b
b'abc'
>>> b.decode()
'abc'

>>> b'abc'.find(b'c')
2

>>> len(('我是中国人').encode())      #求bytes的长度
15
>>> b
b'abc'
>>> b.hex()   #转化为16进制
'616263'

>>> bin(616263)      #转化为2进制
'0b10010110011101000111'

除了encode外,str操作都有对应的bytes版本,但是传入的参数必须是bytes

bytearray类型

bytearray是可变的,bytes和str是不可变的,主要用于图片处理

相对bytes来说,多了insert,append,extend,pop,remove,clear,reverse等操作,并且支持索引操作

>>> S1 = "人生苦短,我学python!"
>>> S1
'人生苦短,我学python!'
>>> b1 = bytearray(S1.encode())
>>> b1.decode()
'人生苦短,我学python!'

>>> b1
bytearray(b'\xe4\xba\xba\xe7\x94\x9f\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe5\xad\xa6python\xef\xbc\x81')
>>> b1[:6] = bytearray('生命'.encode())
>>> S1
'人生苦短,我学python!'
>>> b1
bytearray(b'\xe7\x94\x9f\xe5\x91\xbd\xe8\x8b\xa6\xe7\x9f\xad\xef\xbc\x8c\xe6\x88\x91\xe5\xad\xa6python\xef\xbc\x81')
>>> b1.decode()
'生命苦短,我学python!'
>>>

原文:https://blog.csdn.net/u010694764/article/details/53811035

python2 与python3中最大的区别(编码问题bytes&str的更多相关文章

  1. python2和python3中range的区别

    参考自 python2和python3中的range区别 - CSDN博客 http://blog.csdn.net/xiexingshishu/article/details/48581379 py ...

  2. Python2与python3中字符串的区别

    Python2 在python中包含两种字符串类型:str和unicode,str并不是完全意义上的字符串,其实是由unicode经过编码(encode)后的字节组成的字节字符串,而unicode则是 ...

  3. python2与python3中除法的区别

    python2中的除法 >>>1/2 0 即一个整数(无小数部分的数)被另外一个整数除,计算结果的小数部分被截除了,只留下了整数部分 有时候,这个功能比较有用,譬如在做一些需要取位数 ...

  4. python2和python3中的range区别

    python2中的range返回的是一个列表 python3中的range返回的是一个迭代值 for i in range(1,10)在python2和python3中都可以使用,但是要生成1-10的 ...

  5. [Python3 填坑] 012 字典的遍历在 Python2 与 Python3 中区别

    目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 Python2 中字典的遍历 2.2 Python3 中字典的遍历 2.3 结论 1. print( 坑的信息 ) 挖坑时间:2019/ ...

  6. Python2和Python3的一些语法区别

    Python2和Python3的一些语法区别 python 1.print 在版本2的使用方法是: print 'this is version 2 也可以是 print('this is versi ...

  7. Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  8. 有关python2与python3中关于除的不同

    有关python2与python3中关于除的不同 python中2版本与3版本关于除的处理还是有一些差异的. 在python 2.7.15中除(/)是向下取整的,即去尾法. 123/10 # 结果 1 ...

  9. python2和python3中filter函数

    在python2和python3中filter是不同的,其中在python2中filter返回的是一个list,可以直接使用 >>> a = [1,2,3,4,5,6,7] > ...

随机推荐

  1. HAWQ + MADlib 玩转数据挖掘之(六)——主成分分析与主成分投影

    一.主成分分析(Principal Component Analysis,PCA)简介 在数据挖掘中经常会遇到多个变量的问题,而且在多数情况下,多个变量之间常常存在一定的相关性.例如,网站的" ...

  2. C语言基础:二维数组 分类: iOS学习 c语言基础 2015-06-10 21:42 16人阅读 评论(0) 收藏

    二维数组和一位数组类似. 定义: 数据类型 数组名[行][列]={{ },{ }....}; 定义时,一维(行)的长度可以省略,但是二维(列)的长度不可以省略.但是访问时,一定使用双下标. 二维数组的 ...

  3. RabbitMQ在windows下的安装

    RabbitMQ 它依赖于Erlang,需要先安装Erlang.首先确定你的window电脑是32位还是64位,以下的安装以window 64位电脑举例.   运行行Erlang/OTP(otp_wi ...

  4. 【转】WinForm基础

    winform基础 先修基础:C#语法基础和面向对象编程 1.Winform创建解决方案 2.Winform窗体 3.MessageBOx 4.Winform登录.控制软件只运行一次.回车登录 5.W ...

  5. PHP中redis的使用

    redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集合).这些数据类 ...

  6. pandas.read_csv 参数 index_col=0

    index_col : int or sequence or False, default None 用作行索引的列编号或者列名,如果给定一个序列则有多个行索引. 如果文件不规则,行尾有分隔符,则可以 ...

  7. 电脑技巧合集 - imsoft.cnblogs

    ● 如何制作网页● 教你建一个别人打不开的文件夹 ● 只改一个值!马上加快宽带上网速度 ● 在电脑右下角显示你的名字● XP系统如何加快开机速度● 连接宽带时出错表示的意思 ● 恢复丢失数据的方法● ...

  8. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 auto-focus

    转载至:https://blog.csdn.net/wo541075754/article/details/75349556 auto-focus 在agenda-group章节,我们知道想要让Age ...

  9. day20 python sys os time json pickl 正则

    字符组 : [字符组] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示 字符分为很多类,比如数字.字母.标点等等. 假如你现在要求一个位置....9这10个数之一. 量词 几 ...

  10. day13 python学习 迭代器,生成器

    1.可迭代:当我们打印 print(dir([1,2]))   在出现的结果中可以看到包含 '__iter__', 这个方法,#次协议叫做可迭代协议 包含'__iter__'方法的函数就是可迭代函数 ...