学习小甲鱼的python基础
教程
那么长时间,这中间也有许多深入的思考,有些看似平常的东西,经过深入思考发现原来没那么简单,为了巩固自己的理解,同鱼油交流,特地整理成系列帖子,中间有什么理解或表达有误的地方希望鱼油指正,共同提升。
今天探讨decode encode open
这些涉及到编码,解码的问题,讨论这个问题先要讨论一下编程的整个过程,编程过程为:编辑器里打字-->保存编辑器--->编译代码-->结果。
在你打开编辑器写下代码的时候,你可想过你打的这些字是什么编码格式么,在你保存编辑器的时候你可以选择保存格式比如'utf-8',然后你的内存里就有了'utf-8'格式的源码了,可是在变成'utf-8'格式前的编码是什么啊?也许你会说编辑器不是有默认格式么,但是你要明白那个默认格式是保存后的格式,保存前是什么编码呢?
其实你用编辑器输入的每个字符包括数字都是unicode类型(这个类型是我猜测的,因为涉及到系统问题,无法验证),当你选择按照'utf-8'进行保存的时候会对你的代码进行编码,然后写入内存,至此内存里就有个utf-8格式的源码了。(字符1和数字1在源码中编码都是31,但是字符1前后有个引号,编译器就是靠检测引号来区别字符与数字的)
运行的时候编译器会解析此源码,解析的时候如果也按照utf-8解析,那么源码内容会正确被编译器理解,但是要是换了解析格式那编译器就无法正确识别源码了。这就是为什么py2.x里保存源码用'utf-8',而在开头还要声明用'utf-8'来解析,至于py3.x默认的编码和解析都是'utf-8'.
在py.3x中存在两种数据对象,分别为str和bytes,既字符串(unicode)和字节包(utf,gbk,etc..),而str对象对应的就是传说中的unicode编码,btyes字节包则是各种字节形式的编码对象。bytes对象定义时前边加b。
str对象转成各种bytes对象
>>> a='我'
>>> a.encode('utf-8')
b'\xe6\x88\x91' #unicode---编码成----utf-8
>>> a.encode('gbk')
b'\xce\xd2' #unicode---编码成----gbk
>>> a.encode('unicode-escape')
b'\\u6211' #str对象转化成bytes对象
>>>
各种bytes对象转成str对象
>>> b'\xe6\x88\x91'.decode('utf-8')
'我' #utf-8---解码成---unicode
>>>
>>> b'\xce\xd2'.decode('gbk')
'我' #gbk---解码成---unicode
>>> b'\\u6211'.decode('unicode-escape')
'我' #bytesr对象转化成str对象
# 其实看这个escape’逃离‘单词也能猜到,逃离一种对象成为另一种对象
>>>
通过以上演示应该明白 :
unicode---->编码----->其他编码 就是str对象转化成bytes对象
其他编码---->解码---->unicode 就是bytes对象转化成str对象
下面在讨论一下open中的默认文本模式与't'模式:
默认文本模式对文件操作起来很是顺手,t模式对‘泡菜’数据或者照片等数据进行读写也很顺畅。
但是有想过用‘t’模式对字符串进行操作么,如果‘t’模式也能操作字符串那要默认文本模式干嘛。
不贴代码了直接说结果:
‘t’模式当然能对字符串读写,但前提是要把字符串对象转化成bytes对象,也就是对unicode进行编码,然后才能用二进制模式操作,‘t’模式选择是指定操作对象是str还是bytes。
以上都是个人通过查询资料和上机验证的理解,有误的地方望指出,共同进步。
今天探讨decode encode open
这些涉及到编码,解码的问题,讨论这个问题先要讨论一下编程的整个过程,编程过程为:编辑器里打字-->保存编辑器--->编译代码-->结果。
在你打开编辑器写下代码的时候,你可想过你打的这些字是什么编码格式么,在你保存编辑器的时候你可以选择保存格式比如'utf-8',然后你的内存里就有了'utf-8'格式的源码了,可是在变成'utf-8'格式前的编码是什么啊?也许你会说编辑器不是有默认格式么,但是你要明白那个默认格式是保存后的格式,保存前是什么编码呢?
其实你用编辑器输入的每个字符包括数字都是unicode类型(这个类型是我猜测的,因为涉及到系统问题,无法验证),当你选择按照'utf-8'进行保存的时候会对你的代码进行编码,然后写入内存,至此内存里就有个utf-8格式的源码了。(字符1和数字1在源码中编码都是31,但是字符1前后有个引号,编译器就是靠检测引号来区别字符与数字的)
运行的时候编译器会解析此源码,解析的时候如果也按照utf-8解析,那么源码内容会正确被编译器理解,但是要是换了解析格式那编译器就无法正确识别源码了。这就是为什么py2.x里保存源码用'utf-8',而在开头还要声明用'utf-8'来解析,至于py3.x默认的编码和解析都是'utf-8'.
在py.3x中存在两种数据对象,分别为str和bytes,既字符串(unicode)和字节包(utf,gbk,etc..),而str对象对应的就是传说中的unicode编码,btyes字节包则是各种字节形式的编码对象。bytes对象定义时前边加b。
str对象转成各种bytes对象
>>> a='我'
>>> a.encode('utf-8')
b'\xe6\x88\x91' #unicode---编码成----utf-8
>>> a.encode('gbk')
b'\xce\xd2' #unicode---编码成----gbk
>>> a.encode('unicode-escape')
b'\\u6211' #str对象转化成bytes对象
>>>
各种bytes对象转成str对象
>>> b'\xe6\x88\x91'.decode('utf-8')
'我' #utf-8---解码成---unicode
>>>
>>> b'\xce\xd2'.decode('gbk')
'我' #gbk---解码成---unicode
>>> b'\\u6211'.decode('unicode-escape')
'我' #bytesr对象转化成str对象
# 其实看这个escape’逃离‘单词也能猜到,逃离一种对象成为另一种对象
>>>
通过以上演示应该明白 :
unicode---->编码----->其他编码 就是str对象转化成bytes对象
其他编码---->解码---->unicode 就是bytes对象转化成str对象
下面在讨论一下open中的默认文本模式与't'模式:
默认文本模式对文件操作起来很是顺手,t模式对‘泡菜’数据或者照片等数据进行读写也很顺畅。
但是有想过用‘t’模式对字符串进行操作么,如果‘t’模式也能操作字符串那要默认文本模式干嘛。
不贴代码了直接说结果:
‘t’模式当然能对字符串读写,但前提是要把字符串对象转化成bytes对象,也就是对unicode进行编码,然后才能用二进制模式操作,‘t’模式选择是指定操作对象是str还是bytes。
以上都是个人通过查询资料和上机验证的理解,有误的地方望指出,共同进步。