pycharm运行三大流程
python test.py为例,执行流程如下:
1,启动运行pycharm
2,把要读取的文件,从将数据从硬盘读取到内存
3,取出指令执行,识别python语法,内容展示
PS:pycharm与其他编辑器的区别在于会识别语法,有些编辑器直接显示或者编辑内容
1,字符编码
即人类的语言(比如python,java等语言)转换为机器理解的语言(二进制010101)
需要参考一个特定的标准,比如生活中的hello对应的是你好,而我们使用的计算机的标准就是字符编码表,该表上存放的就是字符与数字一一对应的关系。
字符编码发展史
发展史阶段一:
美国(计算机起源),诞生ASCII表
# ASCII表的特点:
1、只有英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes,1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
发展史阶段二:
为了计算机能够识别中文,中国人定制了GBK表
# GBK表的特点:
1、只有中文字符、英文字符与数字的一一对应关系
2、一个英文字符对应1Bytes
一个中文字符对应2Bytes
补充说明:
1Bytes=8bit,8bit最多包含256个数字,可以对应256个字符,足够表示所有英文字符
2Bytes=16bit,16bit最多包含65536个数字,可以对应65536个字符,足够表示所有中文字符
此外,每个国家都有自己的编码表。。。
加图
发展史阶段三:
万国字符unicode
为解决第二阶段各个国家不相通的问题,出现unicode
# 英文字符可以被ASCII识别
英文字符--->unciode格式的数字--->ASCII格式的数字
# 中文字符、英文字符可以被GBK识别
中文字符、英文字符--->unicode格式的数字--->gbk格式的数字
# 日文字符、英文字符可以被shift-JIS识别
日文字符、英文字符--->unicode格式的数字--->shift-JIS格式的数字
PS:
这样一来,任意字符(中文/英语/日语)走内存unicode都会解析对应的格式(ASCII / gbk等),在写进硬盘(可选择任意格式写入,注意的是,写进硬盘什么格式,读取也要用该格式)
由字符转换成内存中的unicode,以及由unicode转换成其他编码的过程,都称为编码encode
由内存中的unicode转换成字符,以及由其他编码转换成unicode的过程,都称为解码decode
PS:
在诸多文件类型中,只有文本文件的内存是由字符组成的,因而文本文件的存取也涉及到字符编码的问题
编码encode
解码decode
utf8
utf8由来:
如果多国字符包含大量英文字符存储时,使用unicode格式存放会额外占用一倍空间(英文字符其实只需要用一个字节存放即可)
空间占用并不是最致命的问题,最致命地是当我们由内存写入硬盘时会额外耗费一倍的时间,造成io问题
#多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(GBK格式的二进制)
#多国字符—√—》内存(unicode格式的二进制)——X—》硬盘(Shift_JIS格式的二进制)
演变为
# 多国字符—√—》内存(unicode格式的二进制)——√—》硬盘(utf-8格式的二进制)
unicode像是一个过度版本,我们新开发的软件或文件存入硬盘都采用utf-8格式,最后会慢慢淘汰掉unicode
encode & decode
x='上'
res=x.encode('utf-8')
print(res,type(res))
# b'\xe4\xb8\x8a' <class 'bytes'>
print(res.decode('utf-8'))
# 上
参考https://zhuanlan.zhihu.com/p/108805502
b.python内容如下,以GBK格式存储
x='早'
print(x)
# python2执行
ng@mzdeMacBook-Pro Desktop % python2 b.py
File "b.py", line 1
SyntaxError: Non-ASCII character '\xe6' in file b.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
# python3执行
g@mzdeMacBook-Pro Desktop % python3 b.py
早
例1
utf-8写入,python2执行会失败,默认读取ASCII(英文字符)
print('您好')
# ng@mzdeMacBook-Pro Desktop % python2 /Users/shiheng/PycharmProjects/pythonProject/Test/a.py
# File "/Users/shiheng/PycharmProjects/pythonProject/Test/a.py", line 1
# SyntaxError: Non-ASCII character '\xe5' in file /Users/shiheng/PycharmProjects/pythonProject/Test/a.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
python3执行 (默认即utf-8)
# ng@mzdeMacBook-Pro Desktop % python3 /Users/shiheng/PycharmProjects/pythonProject/Test/a.py
# 您好
例2
pycharm只是一个编辑器,写入一个“中文字符” 即gbk格式,
该文件在python2执行会报错,python2默认acsii格式(只能读取英文);
python3执行也会报错,phthon3默认是utf8格式(但写入的是gbk)所以也会报错
print('你好') ===> gbk存入
# python2执行,报错
#ng@mzdeMacBook-Pro Desktop % python2 /Users/shiheng/PycharmProjects/pythonProject/Test/c.py
File "/Users/PycharmProjects/pythonProject/Test/c.py", line 1
SyntaxError: Non-ASCII character '\xc4' in file /Users/shiheng/PycharmProjects/pythonProject/Test/c.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
# python3执行,报错
#ng@mzdeMacBook-Pro Desktop % python3 /Users/PycharmProjects/pythonProject/Test/c.py
File "/Users/PycharmProjects/pythonProject/Test/c.py", line 1
SyntaxError: Non-UTF-8 code starting with '\xc4' in file /Users/PycharmProjects/pythonProject/Test/c.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
总结:写入gbk方式,读取也需要gbk,不然就会报错;
以上python2 默认ASCIIl; python3默认utf-8 所以都会报错
例3
coding:gbk(是小写) 不能是大写;
作用:在首行自定义读取的格式;
ps:如果在pycharm编辑器里写入该首行,编辑器会自动把存储的格式也变成自定义的格式(pycharm默认存储到硬盘是utf8格式)
#coding:gbk
x='您好'
print(x)
# python2 乱码,因为python2不清楚x赋予的变量是什么类型
ng@mzdeMacBook-Pro Desktop % python2 /Users/PycharmProjects/pythonProject/Test/d.py
���
# python3 不乱码是因为python3默认读写都是utf-8
ng@mzdeMacBook-Pro Desktop % python3 /Users/PycharmProjects/pythonProject/Test/d.py
您好
定义字符串变量前面加上u
#coding:gbk
x=u'您好'
print(x)
# python2
ng@mzdeMacBook-Pro Desktop % python2 /Users/PycharmProjects/pythonProject/Test/d.py
您好
# python3
ng@mzdeMacBook-Pro Desktop % python3 /Users/PycharmProjects/pythonProject/Test/d.py
您好
总结
python3默认读取utf8;
在文件首行写入包含#号,
解释器会先用默认的编码方式读取文件的首行内容,由于首行是纯英文组成,而任何编码方式都可以识别英文字符。
#encoding:GBK
x=u'您好'
print(x)
# coding:utf-8
x = u'上' # 即便文件头为utf-8,x的值依然存成unicode
网友评论