第4章文本和字节序列[toc]编码解码markdom可以插入emoji表情包作为前缀,x1f54是对应表情的unicode编码?Emoji将码点转换成字节序列的过程就是编码;将字节序列转换为代码点的过程就是解码。decode的作用是将其他编码的字符串转为unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串转为unicode编码。encode的作用是将unicode编码转换成其他编码的字符串如str2.encode('gb2312'),意思是将unicode编码的字符串转换成gb2312编码。Python3默认使用UTF-8对源代码进行编码,Python2(从2.5开始)默认使用ASCII。如果加载的.py模块包含UTF-8以外的数据,并且没有声明编码,则会报错title:python2encodinganddecodingprocessotherencodingstringsbeforeencoding->unicode:encodingdecodeunicode->>otherencoding编码后的字符String:decodingencode新版python3取消了unicode类型,取而代之的是使用unicode字符的string类型(str)。字符串类型(str)变成基本类型如下图,编码后变成字节类型(bytes)>>编码后的其他编码字符串:解码encode#指定字符串类型对象uu="Chinese"print(u,type(u))#将u用gb2312编码编码得到bytes类型对象strstr=u.encode('gb2312')print(str,type(str))#encodeuwithgb2312对字符串str进行解码,得到字符串类型对象u1u1=str.decode('gb2312')print(u1,type(u1))returnresult:Chineseb'\xd6\xd0\xce\xc4'Chinesechardet模块chardet模块检测从urllib读取str的编码格式.requestimporturlopenimportchardetrawdata=urlopen('http://baidu.com/').read()chr=chardet.detect(rawdata)print(chr)#{'encoding':'ascii','confidence':1.0,'language':''}json.dumps默认用于非ascii字符are使用相应的字符代码生成,而不是原始字符。首先明确一点,chardet判断的是代码,而不是数据类型。其次,加encode只是变成byte,chardet只能接受bytes不能importjs不能接受字符类型onimportchardetdict1={"haha":"haha"}#json.dumps默认ascii编码print(json.dumps(dict1))#{"haha":"\u54c8\u54c8"}#禁止ascii编码后默认utf-8print(json.dumps(dict1,ensure_ascii=False))#{"haha":"haha"}#asciiss=chardet.detect(json.dumps(dict1).encode())print(ss)#utf-8ss=chardet.detect(json.dumps(dict1,ensure_ascii=False).encode())print(ss)json和字典的区别在python中,字典输出的内容和json格式的内容一样,只是格式ofthedictionary是一个字典,而json的格式是一个字符串,所以在传输过程中需要转换使用重要的功能(尤其是网页)。编码:将Python对象编码转换为Json字符串json.dumps()解码:将Json格式字符串转换为Python对象json。loads()例如:importjsondic={'str':'thisisastring','list':[1,2,'a','b']}print(type(dic))#print(dic)json_obj=json.dumps(dic)print(type(json_obj))#print(json_obj)dic1=json.loads(json_obj)print(type(dic1))#print(dic1)几个主要函数dump,dumps,load,loads带s和不带s的区别是带s的是字符串处理,不带s的是文件对象处理。importjsonfromioimportStringIO#创建一个文件流对象io=StringIO()#将json编码后的数据指向这个文件对象json.dump(['streamingAPI'],io)#获取文件流对象的内容print(io.getvalue())#["streamingAPI"]参数ensure_ascii默认为True,输出时所有非ascii字符都会转义成uxxxx序列,返回的对象是一个仅由ascii字符组成的str类型,当它isFalse不会进行转义输出,返回的对象是unicode。(这个参数对于包含中文的json输出很有用)例如:importjsondata={u'我':u'是',u'美':u'女'}print(json.dumps(data))#{"\u6211":"\u662f","\u7f8e":"\u5973"}print(json.dumps(data,ensure_ascii=False))#{"I":"Yes","美":"女"}在处理中文json的时候,如果想避免每次都给一堆重复的参数,可以使用partialimportjsonfromfunctoolsimportpartialjson_dumps=partial(json.dumps,ensure_ascii=False,sort_keys=True)data={u'I':u'is',u'beauty':u'female'}print(json_dumps(data))#{"I":"yes","beauty":"female"}看一个例子:importjson#使用双引号和单引号都可以,建议使用双引号h='{"foo":"bar","foo2":"bar2"}'d="{'muffin':'lolz','foo':'kitty'}"json_obj1=json.dumps(h)json_obj2=json.dumps(d)dic1=json.loads(json_obj1)dic2=json.loads(json_obj2)print("json_obj1=",json_obj1)打印(“json_obj2=”,json_obj2)打印(“dic1=”,dic1)print("dic1type=",type(dic1))print("dic2=",dic2)print("dic2type=",type(dic2))总结:Python的字典是一种数据结构,而JSON是一种数据格式。Python的dictionarykey可以是任意hashable对象,json只能是stringjson模块和simplejson模块环境:python3.6+json:2.0.9simplejson:3.16.0区别1importjsonimportsimplejsonjson_str=b'hello'json_str=json_str.decode()#要使用json模块,必须先加上这一行,否则会报错压力测试脚本:importtimeitimportsimplejsonimportpickleimportjsontimes=100print("Timesarefor%iiterations"%times)f=open('words.pickle',"rb")words=pickle.load(f)f.close()defbench(cmd,imprt):t=timeit.Timer(cmd,imprt)s=t.timeit(number=times)print("%stotal=%02favg=%02f"%(cmd,s,(s/次)))returnsdefsimplejson_loads():simplejson.loads(simplejson.dumps(words))defsimplejson_dumps():simplejson.dumps(words)b1=bench('simplejson_loads()','from__main__importsimplejson_loads')b2=bench('simplejson_dumps()','from__main__importsimplejson_dumps')defjson_dumps():json.dumps(words)defjson_loads():json.loads(json.dumps(words))b3=bench('json_loads()','from__main__importjson_loads')b4=bench('json_dumps()','from__main__importjson_dumps')返回结果为:Timesarefor100iterationssimplejson_loads()total=1.760785avg=0.017608simplejson_dumps()total=0.921571avg=0.009216json_loads()total=1.351725avg=0.013517json_dumps()total=0.716219avg=0.007162从上面的结果可以看出json在加载操作上比simplej要好。json快,我感觉不对