今日学习内容,字符编码。
首先复习一下运行文件的基本操作:
计算机的三个核心组件:CPU、内存、硬盘。
任何一个程序要想运算,必选先有硬盘加载到内存,然后cpu去内存取指执行,运行着的应用程序产生的数据,必先存在内存。
然后是回顾了python解释器运行一个py文件(如xxx.py)的步骤:
1、将python解释器的代码由硬盘读到内存。
2、将xxx.py以普通文本文件形式读到内存。
3、python读取文件内容,识别python语法,执行相应的操作。
(普通的文本编辑器与python解释器的前两步是一样的)
字符编码
今天学习的新内容是字符编码,字符编码针对文字,字符编码只跟文本文件有关。
人在操作计算机的时候输入的是人能够看懂的字符,但是计算机只能识别0101010这样的二进制数据。输入的流程是输入字符>>>字符编码表(字符编码表就是字符与数字的对应关系)>>>二进制数字。
字符编码的发展史以及分类
第一个阶段
计算机由美国人发明,所以最早的字符编码为ASCII。
第二个阶段
中国规定的GBK编码。
日本人规定的Shift_JIS编码。
韩国人规定的Euc-kr编码。
第三个阶段
unicode万国码(能包括全世界的语言)。
为了可以节省unicode耗费空间的UTF-8编码。
结果:内存中统一采用unicode,浪费空间换区可以转换成任意编码(乱码),硬盘采用utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。
unicode的两个特点
1.用户在输入的时候,无论输什么字符都能够兼容万国字符
2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
存取过程中的数据变换:
数据由内存保存到硬盘
1.内存中的unicode格式二进制数字 >>>>编码(encode)>>>>> utf-8格式的二进制数据
硬盘中的数据由硬盘读到内存
1.硬盘中的utf-8格式的二进制数据 >>>>>解码(decode)>>>>> 内存中unicode格式的二进制数据
乱码:字符不能够正常显示 (编码不一致)
保证不乱码的关键在于文本文件以什么编码就用什么解码。
python2
将py文件按照文本文件读入解释器中默认使用ASCII码(因为在开发python2解释器的unicode还没有盛行)
python3
将py文件按照文本文件读入解释器中默认使用utf-8
基于Python解释器开发的软件,只要是中文,前面都需要加一个u
在python2中,当你不指定文件头的时候,默认用ASCII存储数据,如果指定文件头那么就按照文件头的编码格式存储数据。python3中字符串默认就是unicode编码格式的二进制数。
补充点:1.pycharm终端用的是utf-8格式。2.windows终端采用的是gbk。
x = '上' res1 = x.encode('gbk') # 将unicode编码成可以存储和传输的utf-8的二进制数据 print(res1) # b'\xe4\xb8\x8a' # bytes类型 字节串类型 你就把它当成二进制数据即可 res2 = res1.decode('gbk') # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据 print(res2) 你a他 1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes 1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit # 每个Bytes真正的有效位数是7位,而首位是一个标志位。
文件处理
什么是文件?操作系统提供给用户操作复杂硬件(硬盘)的简易接口。
为什么要操作文件?人或者应用程序需要永久的保存数据。
怎么使用?
#1. 向操作系统发送请求,打开某个文件(应用程序要想操作计算机硬件 必须通过操作系统来简介的操作) f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 向操作系统发请求 读取文件内容 f.read() #3. 告诉操作系统 关闭打开的文件 f.close()
with open
with open(r'D:\Python项目\day07\a.txt',encoding='utf-8') as f ,\
可以自动帮你调用f.close()
文件打开的模式
r 只读模式
w 只写模式
a 追加写模式
print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(f.read()) # 一次性将文件内容全部读出
补充:文件路径可以写相对路径,但是需要注意该文件必须与执行文件在同一层文件下。
r模式在打开文件的时候,如果文件不存在,则直接报错
w模式需要慎用
1、文件不存在的情况下,自动创建该文件。
2、文件存在的情况下,先清除文件内容,再写入。
with open(r'xxx.txt',mode='w',encoding='utf-8') as f: # 当文件xxx.txt不存在时,会生成一个该文件。 print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 f.write('不不不,你没有翻~\n') # write是用来写入内容的,\n是用来换行的。 l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n'] f.writelines(l) # writeliens的作用是,写入列表l中的所有内容,内部原理也是一个for循环
a模式
1.当文件不存在的情况下 自动创建该文件
2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后
with open(r'yyy.txt',mode='a',encoding='utf-8') as f: f.write('我是小尾巴\n')
操作文件单位的方式
t 文本文件 t在使用的时候需要指定encoding参数 如果不知道默认是操作系统的默认编码
b 二进制 一定不能指定encoding参数