02. 字符编码发展历史、文件操作

一、知识储备

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()  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值