字符编码
人操作计算机使用人类认识的字符,而计算机存放都是二进制数字
所以人在往计算机里输入内容的时候,必然发生:
人类的字符------(字符编码表)--------》数字
比如我输入一个‘上’的中文字,但是计算机不认识,所以必然需要一个编码表,一边写着计算机认识的二进制和与之一一对应的字符。
然后,再将你输入的字符对应的二进制写进内存,再由内存写入硬盘。
在这之间只有一种编码表
ASCII:只能表示英文字符,用1Bytes对应一个英文字符
内存:ASCII
硬盘:ASCII
GBK:可以表示中文和英文字符,用1Bytes对应一个英文字符,2Bytes对应一个中文字符
内存:GBK
硬盘:GBK
Shift-JIS:
内存:Shift-JIS
硬盘:Shift-JIS
Euc-kr:
内存:Euc-kr
硬盘:Euc-kr
以上是各个国家的字符编码,但是这种字符编码只能在自己的国家使用,所以之后出现了一种统一的字符编码
unicode: 可以对应万国字符,统一用2Bytes对应一个字符
两大特点:
1 可以兼容万国字符
2 与万国字符编码都有一种数字与数字的对应关系
人们写入的字符先转码为unicode编码写进内存,再有硬盘里的GBK、EUC-kr或Shift-JIS编码表进行编码之后写进硬盘
如果要使用,就将字符经过解码,转变为unicode编码,写进内存后再通过unicode编码表一一对应。
GBK数字-----解码decode----->unicode数字
Shift-JIS数字-----解码decode----->unicode数字
GBK数字<-----编码encode-----unicode数字
UTF-8数字<-----编码encode-----unicode数字
字符编码 英文 中文
ASCII 1Bytes 无
GBK 1Bytes 2Bytes
Unicode 2Bytes 2Bytes
Utf-8 1Bytes 3Bytes
保证不乱码的关键:
1 字符当初以什么编码的,就应该以什么编码取解码
强调:此时计算机只使用unicode与字符的对应关系
在python2中:
1 (执行python程序的第二个阶段)解释器在将py文件当普通的文本文件读入内存时默认使用的编码是ASCII
2 有两种字符串类型:
str:x="上" # 文件头指定的编码格式的二进制
unicode:x=u"上" # 存成unicode格式的二进制
ps:pyhon2中unicode就是python3的str类型
在python3中:
1 (执行python程序的第二个阶段)解释器在将test.py当普通的文本文件读入内存时默认使用的编码是UTF-8
2 (执行python程序的第三个阶段,开始识别语法),会字符类型的值开辟一个内存空间存入unicode格式的二进制
ps:python3中的str类型是unicode编码的二进制
3 字符串类型
str: x="上" 把‘上’ 存成unicode格式的二进制
字节串=x.encode('utf-8')
文件头:
在文件首行写上:coding:utf-8
就是在告诉python解释器,不要用其默认的编码,用文件头指定的编码
文件处理
1 什么是文件
文件是操作系统为用户/应用程序提供的一种操作硬盘的抽象单位
2 为何要用文件
用户/应用程序对文件的读写操作会由操作系统转换成具体的硬盘操作
所以用户/应用程序可以通过简单的读\写文件来间接地控制复杂的硬盘的存取操作
实现将内存中的数据永久保存到硬盘中
user=input('>>>>: ') #user="egon"
3 如何用文件
文件操作的基本步骤:
f=open(r'a.txt',encoding='utf-8') #打开文件,拿到一个文件对象f,f就相当于一个遥控器,可以向操作系统发送指令
f.read() # 读写文件,向操作系统发送读写文件指令
f.close() # 关闭文件,回收操作系统的资源
强调:一定要在程序结束前关闭打开的文件
上下文管理:
with open('文件路径',mode='打开模式',encoding='编码表') as f:
pass
with结束后会自动关闭文件
4 .文件的打开模式
r: 只读模式L(默认的)
w: 只写模式
a: 只追加写模式
5.控制读写文件单位的方式(必须与r\w\a连用)
t : 文本模式(默认的),一定要指定encoding参数
优点: 操作系统会将硬盘中二进制数字解码成unicode然后返回
强调:只针对文本文件有效
with open('a.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
print(data,type(data)) with open('1.png',mode='rt',encoding='utf-8') as f:
data=f.read()
b: 二进制模式,一定不能指定encoding参数
with open('1.png',mode='rb',) as f:
data=f.read()
print(data,type(data)) with open('a.txt',mode='rb',) as f:
data=f.read()
print(data,type(data))
print(data.decode('utf-8'))
r: 只读模式L(默认的)
1 当文件不存时,会报错
2 当文件存在时,文件指针指向文件的开头
with open('a.txt',mode='rt',encoding='utf-8') as f:
res1=f.read()
print('111===>',res1)
res2=f.read()
print('222===>',res2) with open('a.txt',mode='rt',encoding='utf-8') as f:
print(f.read())
print(f.readable())
print(f.writable())
print(f.readline())
print(f.readline()) with open('a.txt',mode='rt',encoding='utf-8') as f:
for line in f:
print(line) with open('a.txt',mode='rt',encoding='utf-8') as f:
l=[]
for line in f:
l.append(line)
print(l)
print(f.readlines()
w: 只写模式
1 当文件不存时,新建一个空文档
2 当文件存在时,清空文件内容,文件指针跑到文件的开头
with open('c.txt',mode='wt',encoding='utf-8') as f:
print(f.readable())
print(f.writable())
print(f.read()) f.write('哈哈哈\n')
f.write('你愁啥\n')
f.write('瞅你咋地\n') f.write('1111\n2222\n333\n4444\n') info=['egon:123\n','alex:456\n','lxx:lxx123\n']
for line in info:
f.write(line)
f.writelines(info) with open('c.txt',mode='rb') as f:
print(f.read()) with open('c.txt',mode='wb') as f:
f.write('哈哈哈\n'.encode('utf-8'))
f.write('你愁啥\n'.encode('utf-8'))
f.write('瞅你咋地\n'.encode('utf-8'))
a: 只追加写模式
1 当文件不存时,新建一个空文档,文件指针跑到文件的末尾
2 当文件存在时,文件指针跑到文件的末尾
with open('c.txt',mode='at',encoding='utf-8') as f:
print(f.readable())
print(f.writable())
f.write('虎老师:123\n')
在文件打开不关闭的情况下,连续的写入,下一次写入一定是基于上一次写入指针的位置而继续的
with open('d.txt',mode='wt',encoding='utf-8') as f:
f.write('虎老师1:123\n')
f.write('虎老师2:123\n')
f.write('虎老师3:123\n') with open('d.txt',mode='wt',encoding='utf-8') as f:
f.write('虎老师4:123\n') with open('d.txt',mode='at',encoding='utf-8') as f:
f.write('虎老师1:123\n')
f.write('虎老师2:123\n')
f.write('虎老师3:123\n') with open('d.txt',mode='at',encoding='utf-8') as f:
f.write('虎老师4:123\n')