字符编码、文件操作
一、知识储备
1.程序运行与三大核心硬件的关系
程序最先都是存放于硬盘之中的
程序运行时是先把程序从硬盘中加载到内存中去
然后CPU从内存中读取数据和指令运行
2.程序产生的数据最初都是存放于内存中
3.python程序运行的三个步骤:
如:python3 D:\a.py
① 先启动python解释器
② 解释器将文件a.py中的内容当成普通内存从硬盘加载到内存中(此时没有语法意义)
③ 解释器会解释、执行刚刚读入内存的内容,并识别python语法执行程序
二、字符编码
字符-------(标准)---------数字
字符编码表:存放字符与数字之间对应关系的表
1、ASCII:只能识别英文字符
特点:采用8bit对应一个英文字符,即一个字节(Byte)
2、GBK:可以识别中文字符和英文字符
特点:采用16bit对应一个字符(中英文都是16bit,即两个字节)
3、shift-JIS:可以识别日文和英文字符
4、Unicode:可以识别万国字符
特点:采用两个字节对应一个字符
字符-------->Unicode格式的数字(对应着转换成GBK、shift-JIS、英文等所有的字符)
中文字符、英文字符------------》unicode二进制数-----------》gbk二进制数
日文字符、英文字符------------》unicode二进制数-----------》shiftJIS二进制数
韩文字符、英文字符------------》unicode二进制数-----------》Euc-kr二进制数
万国字符--------------------》unicode二进制数-----------》utf-8二进制数
5、utf-8
特点:
1Byte对应一个英文字符
3Byte对应一个中文字符
三、字符编码的发展历史
1、群雄割据
各国语言不统一,相互之间不兼容
英文字符---------------内存:ASCII二进制数------------->硬盘:ASCII二进制数
中文英文字符------------内存:GBK二进制数--------------->硬盘:GBK二进制数
日文英文字符------------内存:shiftJIS二进制数---------->硬盘:shiftJIS二进制数
韩文英文字符------------内存:Euc-Kr二进制数------------>硬盘:Euc-Kr二进制数
2、过度阶段
内存固定使用Unicode格式,
人为可以改变由内存写入硬盘的编码格式
中文英文字符----------内存:unicode========gbk===========>硬盘:GBK 二进制数
日文英文字符----------内存:unicode========shif-JIS======>硬盘:shiftJIS 二进制数
韩文英文字符----------内存:unicode========Euc-Kr========>硬盘:Euc-Kr 二进制数
万国字符-------------内存:unicode========utf-8=========>硬盘:utf-8 二进制数
3、分久必合
由于现阶段部分旧的程序和数据仍然是用GBK、ASCII等编码格式保存的,目前的内存都是Unicode编码格式,以便兼容。
等过度阶段成为历史,内存默认的编码格式将向utf-8转变
万国字符------------内存:unicode=========utf-8============>硬盘:utf-8二进制数
万国字符------------内存:utf-8=====无需转码直接写入、读取=====>硬盘:utf-8二进制数
四、乱码问题
1、存的时候就已经乱了
采用的字符编码表无法识别输入的字符
存的时候就已经乱码了,无法补救,取的时候解码也会乱码
解决方法:存入硬盘的编码格式应该用utf-8格式
2、存的时候没有乱
采用的字符编码表可以识别输入的字符
但是取的时候乱码了:采用的字符编码表与当初存的时候用的不是同一张表
解决方法:取的时候,解码使用与存的时候一样的编码格式
即:
字符-----编码--------》unicode格式的数字------编码-----》gbk格式的数字
字符-----解码--------》unicode格式的数字《------解码-----gbk格式的数字
3.与python程序相关的乱码问题
① 保证python运行的前两个步骤不乱码:
在文件开头加一行:
#coding:文件存的时候的编码格式
② 保证python运行第三个步骤不会乱码:
使用python3(python3中字符串类型的值都是以Unicode格式的数字)
如果使用的是python2,在字符串之前加前缀 u
4.bytes
bytes类型可以理解为一种硬盘的原生格式
x = '好'
res1 = x.encode('GBK')
res2 = x.encode('utf-8')
print(res1) # b'\xba\xc3'
print(res2) # b'\xe5\xa5\xbd'
data1 = res1.decode('gbk')
data2 = res2.decode('utf-8')
print(data1) # 好
print(data2) # 好
五、文件操作
1、什么是文件?
文件是操作系统提供给用户/应用程序操作硬盘的一种功能(虚拟单位)
用户/应用程序对硬盘的读写操作都是在对操作系统发起调用
操作系统在收到调用请求后,会将该请求转换成具体的硬盘操作
2、为什么要用文件?
存取硬盘必须使用文件
应用程序操作文件都是为了将内存中的数据永久保存到硬盘中去
3、如何使用文件?
f = open(file_path, mode)
f.write(data)
f.close() # 调用完以后要关柄操作,释放操作系统资源
文件操作与计算机三层结构的关系:
用户/应用程序----------文件对象/句柄----------->遥控器
操作系统---------------打开文件a.txt --------->空调
计算机硬件--------------硬盘
(1)文件的路径(找到文件的地址)
绝对路径:
Windows系统中,如 r'D:\py\data\a.txt' ,前缀r是为了规避文件路径中的转义字符
Linux系统中,如:/a/b/c/d.txt
相对路径:基于程序所在的文件夹往后找,如 r'a.txt' ,(当前文件夹中的a.txt)
(2)文件句柄(相当于一个遥控器)
f = open(r'a.txt', mode='rt', encoding='utf-8')
data = f.read()
print(data)
f.close()