一.字符编码
1.1什么是字符编码
计算机是基于电工作的,换而言之计算机只能识别二进制数(0,1),让计算机能懂得人类的语言,也就是如何将是实现字符到数字的过程,一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。
1.2字符编码的发展史
1.ASCII码表
用8位二进制数(1Bytes)表示一个英文字符,数量最多可至256个(0-255/0000 0000-1111 1111)
2.各国各自制定的编码表
为了满足中文和英文的需求,中国制定了GBK
GBK:2Bytes表示一个中文字符,1Bytes表示一个英文字符
日本制定了shift_JIS
韩国人制定了Euc_kr
3.统一标准
unicode:统一用2个Bytes表示一个字符
unicode的缺点:
1.浪费存储空间
2.io次数增加,程序运行效率降低(致命)
unicode的优点:
1.能兼容万国字符
2.其他国家的编码数据由硬盘读到内存的时候Unicode与其他国家的编码都有对应关系
对于全是英文的文章来说,Unicode的样式多了一倍的存储空间,这样太过浪费,所以后来出现了utf-8。在utf-8中对英文字符采用1Bytes表示,对中文字符采用3Bytes表示。
现状:
内存中采用Unicode
硬盘中采用utf-8
4.编码和解码过程
编码(encode):
数据由内存保存到硬盘
1.内存中的unicode格式二进制数>>>>编码(encode)>>>>>utf-8格式的二进制数据
硬盘中的数据由硬盘到内存
1.硬盘中的utf-8格式的二进制数据>>>>解码(decode)>>>>>内存中的Unicode格式的二进制数据
ps:1.如何保证不乱码在于文件用什么编码编写的就用什么编码解
2.关于python2和python3的区别
在pytho2中按照文本文件读入解释器中默认使用ascii码(unicode还没盛行)
在python3中按照文本文件读入解释器默认使用的是utf-8
文件头:# condong:(字符编码) eg:(# conding:utf-8)
写在文件的开头,让解释器以规定的字符编码来解读文件
x = '上' res1 = x.encode('utf-8') # 将unicode编码成可以存储和传输的utf-8的二进制数据 print(res1) # b'xe4xb8x8a' # bytes类型 字节串类型 你就把它当成二进制数据即可 res2 = res1.decode('utf-8') # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据 print(res2)
二.文件处理
2.1什么是文件
操作系统暴露给我们操作复杂硬件(硬盘)的简易接口
2.2为什么操作文件
人或者应用程序要永久保存数据
2.3如何用文件
f=open()
f.read()
f.close()
2.4如何通过python代码操作文件
使用open命令如:
r取消转义 f = open(r'D:Python项目day07a.txt',encoding='utf-8') # 向操作系统发送请求 打开某个文件 # 应用程序要想操作计算机硬件 必须通过操作系统来简介的操作 print(f) # f是文件对象 print(f.read()) # windows操作系统默认的编码是gbk python默认的是utf-8 f.read() # 向操作系统发请求 读取文件内容 f.close() # 告诉操作系统 关闭打开的文件 print(f) print(f.read())
ps:如要打开a.txt在输入文件路径时可以采用绝对路径也就是文件的全部路径名称,也可以采用相对路径,加入文件在‘day07’文件夹下,此刻有另一个‘day07’下文件夹b.txt可以直接输入r'a.txt',encoding='utf-8'打开文件
2.5文件上下文操作
with open(r'D:Python项目day07a.txt',encoding='utf-8') as f , open(r'D:Python项目day07.txt',encoding='utf-8') as f1: # f仅仅是一个变量名 你把它看成是一个遥控器 print(f) print(f.read()) print(f1) print(f1.read())
2.6文件打开模式
t:操作文件内容都是以字符串为单位,会自动帮我们解码,必须指定encoding参数
b:操作文件都是以Bytes(二进制)为单位,硬盘中存的是什么就取出来什么一定不能指定encoding参数
ps:文件的打开模式一定要和打开方式一起使用如“rt”,其中t模式只能用于文本文件,b模式可以用于任何文件
2.7文件打开的方式
r:只读模式
w:只写模式
a:追加写模式
r模式:只读模式,如果打开的文件存在则光标跳到文件的开头,如果文件不存在则会报错
with open(r'D:pythonpython练习a.txt',mode = 'rt',encoding = 'utf-8') as f: print(f.readable()) # 是否可读 True print(f.writable()) # 是否可写 False print(f.read()) # 一次性将文件内容全部读出
ps:其中mode参数可以不写,不写默认是rt模式,只读的文本文件,其中rt中的t不写可以不写
with open(r'D:pythonpython练习a.txt') as f: pass
相对路径:
with open(r'数据类型分类.jpg',mode='rb') as f: pass
rb模式:
with open(r'C:Users何晓东Desktop上课截图数据类型分类.jpg',mode='rb') as f: print(f.readable()) # 是否可读 True print(f.writable()) # 是否可写 False print(f.read()) # 一次性将文件内容全部读出
with open(r'D:pythonpython练习a.txt',mode = 'rt',encoding = 'utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(">>>1:") print(f.read()) # 一次性将文件内容全部读出 print('>>>2:') print(f.read()) # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读 print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容 由于光标在最后返回为[] print(f.readline()) # 只读取文件一行内容
w模式:只写模式,打开的文件若不存在则新建该文件,若存在则打开并清空其中内容然后在写入(慎用)
with open(r'D:pythonpython练习a.txt',mode = 'wt',encoding = 'utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 f.write('学习使我快乐,我爱学习 ') f.write('学习使我快乐,我爱学习 ') f.write('学习使我快乐,我爱学习 ') f.write('学习使我快乐,我爱学习 ') f.write('学习使我快乐,我爱学习 ') l = ['学乐,我学习 ','学习使我快乐,我习 ','学乐,我爱学习 '] f.writelines(l) # 输入多行
a模式:追加写模式 打开的文件若不存在,会自动创建该文件,若已存在则会打开文件不清空内容并把光标移至最后
with open(r'D:pythonpython练习a.txt',mode = 'a',encoding = 'utf-8') as f: print(f.readable()) # 是否可读 False print(f.writable()) # 是否可写 True f.write('我超爱学习 ')