储备知识点:
- 计算机系统分为三层:
应用程序
操作系统
计算机硬件 - 运行python程序的三个步骤
- 1.先启动python解释器
- 2.再将python文件当作普通文本文件读入内存
- 3.解释执行读入内存的代码,开始识别语法
1.字符编码
- 什么是字符编码
- 字符编码表:人类的字符<---------------------->数字(二进制)
硬盘存文件是用二进制存的,我们写文件用的又是我们自己的语言所以有了这个需求
- 字符编码表:人类的字符<---------------------->数字(二进制)
这里有一个二进制位的概念:
8bit(一个二进制位)=1Bytes(可以简称1B)
-
-
ASCII码:只能识别英文字符(大概100多个字符,为了能用二进制区分,我们用8个二进制位表示一个英文字符),
1英文字符=8bit (用8个二进制位表示一个英文字符)
-
-
-
GBK码(当计算机不再只在美国被使用时,传入中国,就有识别汉字字符的需求):能识别汉字字符和英文字符
1个汉字字符=16bit(汉字毕竟比较多,中华文化博大精深,需要更多的二进制位区分了) 1个英文字符=8bit(区分方法和ASCII码的形同)
-
-
- Shift_JIS码(它也传到日本了,有了需求)
-
- Euc-kr码(又到韩国,又有了需求)
这里有一个问题,如果一个中国人写了一个很NB的程序,美国人想用,日本人也想用,把我们的程序存到他们国的计算机硬盘中,存都是二进制没有问题,可是当他们要运行程序,要都文件的时候,比如是美国人,他们计算机是用ASCII码读的,他们的ASCII码表中没有汉字字符,他们读出来的就是乱码。程序或者文本读出也没打用,根据这个需求
-
-
unicode码:能识别万国字符(用的起电脑的国家的字符)
1个字符(每种字符)=2Bytes=16bit
两大特点:
- 1.能兼容万国字符
- 2.与各个国家的字符编码都有映射关系
-
-
-
utf-8:是unicode的转换格式(和unicode相比储存更节省空间)
1个英文字符=1Bytes , 1个汉字字符=3Bytes
-
这里穿插一个对字符编码的想法:首先为什么unicode要有和各个国家的字符编码有映射关系,为什么么不直接用笔unicode更省储存空间的utf-8?
当有可兼容万国字符的unicode时,之前的程序\文本文件都是各国用自己国家的字符编码做的,不可能直接用unicode是不能解码的,不能之前写的程序都不用了,需要有一个平缓的过渡,所以unicode需要有和各国的字符编码有映射关系,可以转换。
utf-8他是没有直接对应的字符的,它是直接和unicode有一个映射关系,当我们过渡完了,所以的所有软件都是utf-8的方式储存的时候,unicode包括各国的字符编码表都会退出历史舞台。
- 重点理论
-
1.编码与解码
字符---编码-->unicode的二进制-------编码----->GBK的二进制 GBK的二进制-----解码-->unicode的二进制----解码->字符
-
2.决乱码问题的核心法则:
字符用什么编码格式编码的,就应该用什么编码格式进行解码
-
3.python解释器默认的字符编码
python2:ASCII python3:UTF-8 通过文件头可以修改python解释器默认使用的字符编码 在文件首行写:#coding:文件当初存的时候用的字符编码
-
针对python2解释器中定义字符串应该:
x=u"上" 对于python3解释即便是x="上"不加u前缀也是存成unicode
-
在python3中
x='上' #'上'存成了uncidoe
-
unicode--------encode----------->gbk
res=x.encode('gbk') #res是gbk格式的二进制,称之为bytes类型
-
gbk(bytes类型)-------decode---------->unicode
y=res.decode('gbk') #y就是unicode
-
2 .为何字符要编码
- 人类与计算机打交道用的都是人类的字符,而计算机无法识别人类的字符,只能识别二进制,所以必须将人类的字符编码成计算机能识别的二进制数字.
2.文件处理
- 1 什么是文件
文件是操作系统提供给用户/应用程序的一种虚拟单位,该虚拟单位直接映射的是硬盘空间
- 2 为何要处理文件
用户/应用程序直接操作文件(读/写)就被操作系统转换成具体的硬盘操作,从而实现
用户/应用程序将内存中的数据永久保存到硬盘中
- 3 如何用文件
-
- 文件处理的三个步骤:
f = open(r'c.txt',mode = 'r',encoding = 'utf-8') # 文件对象(应用程序的内存资源)------》操作系统打开的文件(操作系统的内存资源)
print(f) #f变量为打开c.txt文件,读文件,utf-8解码
data=f.read() #定义一个变量,变量值是读到的文件文本read方法返回值为读到的文本字符
print(data)
f.close() # 向操作系统发送信号,让操作系统关闭打开的文件,从而回收操作系统的资源
# 上下文管理
with open(r'c.txt',mode='r',encoding='utf-8') as f,open(r'b.txt',mode='r',encoding='utf-8') as f1:
# 读写文件的操作
pass
#这个方法是防止忘记让操作系统关闭打开的文件,当操作完成后会自动关掉打开的文件
-
- 文件的打开模式:r(默认的) w a
-
-
操作文件内容的模式:
1.t(默认的):操作文件内容都是以字符串为单位,会自动帮我们解码,必须指定encoding参数 2.b: 操作文件内容都是以Bytes(二进制)为单位,硬盘中存的时什么就取出什么,一定不能指定encoding参数 总结:t模式只能用于文件本文件,而b模式可以用于任意文件
-
-
- r模式:只读模式,在文件不存在时则报错,如果文件存在文件指针跳到文件的开头
with open(r'c.txt',mode='rt',encoding='utf-8') as f: #操作文件内容都是以字符串为单位,会自动帮我们解码
print(f.read()) #读文件操作
print(f.readable()) #判断文件是否可读
print(f.writable())f.write('hello') # 只能读,报错
data=f.read()
print(data,type(data)) #读的操作,读出来的是str类型
with open(r'c.txt',mode='rb') as f: #存的什么样,就取出什么样
data=f.read()
print(data,type(data)) #输出二进制类型,type:bytes
res=data.decode('utf-8') #用utf-8解码
print(res)
with open(r'c.txt',mode='rt',encoding='utf-8') as f:
line=f.readline() #readline只读一行,当碰到换行符时停止
print(line,end='') #print中默认end=‘\n’换行,我们让它不换行
line1=f.readline()
print(line1,end='')
line2 = f.readline()
print(line2,end='')
lines=f.readlines() #readlines以列表的形式全部读
print(lines)
#read方法直接全读,如果文件太大,直接全部读入内存,内存会炸,readlines方法一样
#当我们有全读大文件的需求时
#可以空循环读文件内容的方法:
with open(r'c.txt',mode='rt',encoding='utf-8') as f:
for line in f:
print(line,end='')
#用for循环一行一行读
'''
总结:
read方法和readlines方法的局性:
都只能读小文件
'''