字符编码
1、什么是字符编码
文字符号--------编码------------>数字
文字符号<--------解码------------数字
我们要将计算机上的文件数据保存到硬盘当中,但肯定不能直接保存进去,硬盘只能接受二进制,所以我们在保存进硬盘的时候都会先将其转换为二进制
字符编码表:
一个字符对应一个数字
2、为何要研究字符编码
为了解决乱码问题:
1、存取都用同一张字符编码表
3、字符编码表的发展历程
1、一家独大
ASCII:只能识别英文字符
用8个bit对应一个英文字符
最开始美国制定字符编码的时候考虑到是为了自己的人使用,所以能接受转换的只有英文,只有这一种编码表,所以能互相交流
2、天下大乱
GBK:能识别中文和英文
用16个bit(2Bytes)对应一个字符
后来电脑发展,各个国家也开始使用,但由于有些国家并不是英语为主体的,所以他们也制作了适合自己国家的字符编码,但由于语言不是互通的,导致有些并不能翻译,就会导致乱码
shift-JIS(日本的字符编码)
Euc-KR
3、归于一统
unicode:能识别万国字符
用16bit(2Bytes)对应一个字符
utf-8
后来统一制作能识别万国字符的unicode,所以现在可以解码很多数据,utf-8可以看作unicode的稳定升级版,但是并不能拿来完全解码,只有等到使用unicode的旧软件退场后才能完全使用,现在大部分软件都是默认utf-8,就是为了方便编码和解码
总结:
英文字符----》内存(ASCII格式的二进制数)----》硬盘(ASCII格式的二进制数)
中文、英文字符—》内存(GBK格式的二进制数)----》硬盘(GBK格式的二进制数)
日文、英文字符—》内存(Shif-jis格式的二进制数)–》硬盘(Shif-jis格式的二进制数)
万国字符----》内存(unicode格式的二进制数)--》硬盘(utf-8格式的二进制数)
5、运行python程序的三个阶段
1、先启动一个python解释器
2、python解释器会将文件内容从硬盘读入内存
3、python解释器会解释执行刚刚读入内存的代码,识别语法
x=“你好hello”
编码和解码的步骤
# 字符-------------》unicode格式的二进制(内存)--------------->utf-8格式的二进制(硬盘)
# 编码 编码
# 字符《-------------unicode格式的二进制(内存)<---------------utf-8格式的二进制(硬盘)
# 解码 解码
一个小"栗子":
x="上"
print(x) # 打印unicode等同于打印字符
utf8_res=x.encode("utf-8")#将x用utf-8进行编码
# print(utf8_res,type(utf8_res)) # bytes等于二进制#输出编码后的二进制,也输出类型
unicode_res=utf8_res.decode("utf-8")#用utf-8格式进行解码
print(unicode_res)#输出解码后的内容
文件处理的基本步骤
# f=open("aaa.py",mode='rt',encoding='gbk')#打开aaa.py文件,模式用只读,用txt显示,字符编码是gbk
#
# res=f.read()#先读里面的内容并且赋值给res
# print(res)#输出res
#
# f.close()#关掉操作系统占用的资源
# f.read()#没法调用这个功能
上下文管理
with open(“aaa.py”,mode=‘rt’,encoding=‘gbk’) as f:#调用with方法,当代码离开with语句时,会自动关闭
res = f.read()
print(res)
文件打开模式
一:控制读写操作模式
r:只读===========>默认(只要不写出来就是默认状态)
w:只写(如果存在文件,就会清空文件内容)
a:只追加写(跳转到文件末尾来追加,注意不是最后一行新添加一行,是直接接着最后一行后面)
二:控制读写内容的模式
t:读写都是文本格式,即读写都是用字符串========》默认
b:读写都是bytes格式,bytes等同于二进制#使用b的时候不用指定字符编码,但是要注意打开的文件大小,因为可能文件过大会对内存有影响
强调:
如果是t模式,一定记住加上encoding=“编码格式”
如果是b模式,一定记住别加encoding=“编码格式”
三 案例
# 3.1 案例1
# r:在文件存在的时候,文件指针调到文件开头,文件不存在直接报错
# f=open("a.txt",mode="rt",encoding='utf-8')
# # res=f.read()
# # print(res)
# f.close()
3.2 案例2
# w:在文件存在的时候会清空文件,文件指针调到文件开头,文件不存在会创建空文档
# f=open("c.txt",mode="wt",encoding='utf-8')
# # f.write("aaaa\n")
# # f.write("bbbb\n")
# # f.write("cccc\n")
# f.write("11111\n")
# f.close()
3.3 案例3
# a:在文件存在的时候不会清空文件,文件指针调到文件末尾,文件不存在会创建空文档
# f=open("d.txt",mode="at",encoding='utf-8')#a是追加,只会在末尾继续写,要换行需要自己添加换行符
# f.write("6666666\n")
# f.write("6666666\n")
# f.write("6666666\n")
# f.write("11111\n")
# f.close()
3.4 案例4:rb wb ab
# f=open("a.txt",mode='rb')#用二进制的方式打开文件
# res=f.read()#将读的结果赋值给res
# print(res.decode("utf-8"))#用utf-8解码并打印
# f.close()#回收计算机资源
# f=open("D:\fullstack16\day05\视频\01 本周内容.mp4",mode='rb')#用二进制的方式打开文件
# res=f.read()#将读的结果赋值给res
# print(res)#打印结果
# f.close()#回收资源
# f=open("a.txt",mode='ab')#打开文件,模式是追加,二进制
# f.write("你好".encode('utf-8'))#写入你好,并且用utf-8编码
# f.close()#回收资源
# with open(r"D:\fullstack16\day05\视频\01 本周内容.mp4",mode='rb') as f1,\
# open(r"D:\111111.mp4",mode="wb") as f2:#打开两个文件,并且f1的是仅读,并且是二进制,f2的是仅写,二进制
# res=f1.read()#将读的结果赋值给res
# f2.write(res)#将res的内容写入f2
这个方法适用于打开的文件不是很大的情况,不然内存容易被占满,容易卡住
# for line in f1:#循环读出f1里的内容
# f2.write(line)#将line里的内容依次写入f2里
这个方法适用于内容比较大的文件