python 的 encode 、decode、字节串、字符串

一、摆个图

DJ  DJ  DJ   Decode、 J 解码  

  首先得知道字符串有哪些编码格式,至于为什么会有这么多的编码格式,以后再了解更新。

      1、ASCII 占1个字节,只支持英文

           2、GB2312 占2个字节,支持6700+汉字

           3、GBK GB2312的升级版,支持21000+汉字,中文2个字节。

           4、Unicode 2-4字节 已经收录136690个字符

           5、UTF-8: 使用1、2、3、4个字节表示所有字符;优先使用1个字符、无法满足则使增加一个字节,最多4个字节。

           英文占1个字节、欧洲语系占2个、东亚占3个,其它及特殊字符占4个。中文3个字节。

           6、UTF-16: 使用2、4个字节表示所有字符;优先使用2个字节,否则使用4个字节表示。

  在 python2 和 python3 默认的编码格式是不一样的。Python2默认是ASCII编码,python3 是unicode编码。所以在用python2 时候会 绕一下。

  一般在用 python2 时候会先在开头加上 

    #coding=utf-8

  Python2中默认是ASCII码,一般会加入以utf-8编程。那么这个时候所有用到的 字符串 都是 utf-8 的编码格式,中文也不例外。

#coding=utf-8
#Python2中默认是ASCII码,一般会加入以utf-8编程
a = '编码'                       # a是utf-8类型
b = a.decode('utf-8')       # b是Unicode类型
c = b.encode('gbk')        #c是gbk类型
d = c.decode('gbk').encode('utf-8')   #先将c转换成Unicode,再转成utf-8
print a ,b,c,d
print type(a),type(b),type(c),type(d)

 

 

 python3 默认是Unicode 编码格式

a = '编码'                       # a是unicode类型
b = a.encode('utf-8')       # b是utf-8类型
c = a.encode('gbk')        #c是gbk类型
print (a ,b,c)
print (type(a),type(b),type(c))
#python3默认是unicode类型

 

 

  encode 出来的 永远是 字节串。

 二、encode、decode

  字符串的编码解码第一次接触是在 socket编程,socket 套接字传输的必须是字节串,其实Bytes才是计算机里真正的数据类型,也是网络数据传输中唯一的数据格式,什么Json,Xml这些格式的字符串最后想传输也都得转成Bytes的数据类型才能通过socket进行传输,而Bytes的数据与字符串类型数据的转换就是编码与解码的转换,utf-8是编解码时指定的格式。所以在 发送数据时候做了一步 字符串编码   str.encode('utf-8') ,编码格式选的 utf-8,这样就把字符串变成了字节串。【在python3 时候的操作】

   在 接收端,接收到的数据需要转码,rev.decode('utf-8') ,编解码的格式可以自己选择。

  这里存在一个数据传输隐患。当传输的数据超过一次性最大接收量,或者多次传输,那数据流被分割为多个部分,那么我们就不知道某个字符是否由于位于分割边界而从中间被分开。此时对部分接受的信息进行解码是很危险的。比如中文,在编码后是多字节的形式。编码方式主要分为两大类,单字节编码和多字节编码,前者即每个字符与字节的值唯一对应,后者中每个字符可能会用多个字节来表示。由于在一些多字节编码方式中,用于表示不同字符的字节数是不同的,因此操作起来要多加小心。

 

三、序列化、反序列化   json

  不同的编程语言有一个共同的数据类型---字符串类型。

  所以要实现不同的编程语言之间对象的传递,就必须把对象序列化为标准格式,比如XML,但更好的方法是序列化为JSON,因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且可以直接在Web页面中读取,非常方便。

  在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象。在python的标准库中,专门提供了json库与pickle库来处理这部分。

  json的dumps方法和loads方法,可实现数据的序列化和反序列化。具体来说,dumps方法,可将json格式数据序列为Python的相关的数据类型;loads方法则是相反,把python数据类型转换为json相应的数据类型格式要求。在序列化时,中文汉字总是被转换为unicode码,在dumps函数中添加参数ensure_ascii=False即可解决。

import json
print (json.__all__)  #查看json库的所有方法
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONEncoder']

=========================================== dumps 序列化
未在dumps函数中添加参数ensure_ascii
=False,结果如下: #coding: utf-8 import json dict = {'name':'zhangsan', 'age':33, 'address':'红星路'} print('未序列化前的数据类型为:', type(dict)) print('为序列化前的数据:', dict) #对dict进行序列化的处理 dict_xu = json.dumps(dict) #直接进行序列化 print('序列化后的数据类型为:', type(dict_xu)) print('序列化后的数据为:', dict_xu)
结果: 未序列化前的数据类型为:
<class 'dict'> 为序列化前的数据: {'name': 'zhangsan', 'address': '红星路', 'age': 33} 序列化后的数据类型为: <class 'str'> 序列化后的数据为: {"name": "zhangsan", "address": "\u7ea2\u661f\u8def", "age": 33} 在dumps函数中添加参数ensure_ascii=False,结果如下: #coding: utf-8 import json dict = {'name':'zhangsan', 'age':33, 'address':'红星路'} print('未序列化前的数据类型为:', type(dict)) print('为序列化前的数据:', dict) #对dict进行序列化的处理 dict_xu = json.dumps(dict,ensure_ascii=False) #添加ensure_ascii=False进行序列化 print('序列化后的数据类型为:', type(dict_xu)) print('序列化后的数据为:', dict_xu)
结果: 未序列化前的数据类型为:
<class 'dict'> 为序列化前的数据: {'address': '红星路', 'age': 33, 'name': 'zhangsan'} 序列化后的数据类型为: <class 'str'> 序列化后的数据为: {"address": "红星路", "age": 33, "name": "zhangsan"} ==================================================== loads 反序列化 #coding: utf-8 import json dict = {'name':'zhangsan', 'age':33, 'address':'红星路'} print('未序列化前的数据类型为:', type(dict)) print('为序列化前的数据:', dict) #对dict进行序列化的处理 dict_xu = json.dumps(dict,ensure_ascii=False) #添加ensure_ascii=False进行序列化 print('序列化后的数据类型为:', type(dict_xu)) print('序列化后的数据为:', dict_xu) #对dict_xu进行反序列化处理 dict_fan = json.loads(dict_xu) print('反序列化后的数据类型为:', type(dict_fan)) print('反序列化后的数据为: ', dict_fan)
结果: 未序列化前的数据类型为:
<class 'dict'> 为序列化前的数据: {'name': 'zhangsan', 'age': 33, 'address': '红星路'} 序列化后的数据类型为: <class 'str'> 序列化后的数据为: {"name": "zhangsan", "age": 33, "address": "红星路"} 反序列化后的数据类型为: <class 'dict'> 反序列化后的数据为: {'name': 'zhangsan', 'age': 33, 'address': '红星路'}

  

  在 实际运用中,序列化或者反序列化的可能是一个文件的形式,不可能像如上写的那样简单的,下来就来实现这部分,把文件内容进行序列化和反序列化,

序列化,  两步操作:1、先序列化 列表对象 ;2、步把序列化成的字符串写入文件:
反序列化,两步操作:1、先读取文件的字符串对象;2、然后反序列化成列表对象:

#coding: utf-8
import json
 
list = ['Apple','Huawei','selenium','java','python']
#把list先序列化,写入到一个文件中
# 两步操作 1步先序列化 列表对象 2步把序列化成的字符串写入文件
json.dump(list, open('e:/test.txt','w'))  
r1=open('e:/test.txt','r')
print(r1.read())
#------------------------------------------------------------
#两步操作:1、先读取文件的字符串对象;2、然后反序列化成列表对象
res=json.load(open('e:/test.txt','r'))
print (res)
print('数据类型:',type(res))

结果:
["Apple", "Huawei", "selenium", "java", "python"]
['Apple', 'Huawei', 'selenium', 'java', 'python']
数据类型: <class 'list'>

 

  

 四、https://www.cnblogs.com/xyn123/p/8869754.html  参考

  

posted @ 2019-06-03 01:01  马克图  阅读(838)  评论(0编辑  收藏  举报