今日内容
-
字符编码
-
文件处理
一、字符编码
1、什么叫字符编码
人在操作计算机的时候输入的是人能看懂的字符,但计算机只能识别01010101。。。这样的二进制,那么将输入的字符转换成计算机认识的二进制的过程就是字符编码
2、字符编码表
每个字符都应该有自己专有的二进制代码,将字符与二进制的对应关系编程的表就叫字符编码表。
3、字符编码的发展史
由于每个国家有自己的语言和字符,导致每个国家的字符编码表的对应关系不同,每个国家的计算机只能与本国的计算进行通信,不利于国家之间的交流。例如美国有ASCII码表,中国有GBK编码表、日本有shift编码表。
为了方便各个国家之间的通信,万国码Unicode应用而生,对所有国家的编码关系进行了新的关系制定。虽然便利了各个国家的通信,但是大大的增加了存储数据的空间,降低了存储读取效率,耗时变长了,程序运行效率降低了,这是很致命的。
为了解决万国码Unicode带来的副作用,utf-8编码表被制造了出来。在utf-8中,根据字符的不同,有1个字节、2个字节、3个字节存储字符的规则。例如会将Unicode的英文字符由原来的2Bytes变成1Bytes,会将Unicode中文字符由原来的2Bytes变成3Bytes。经过测试,utf-8的效率远高于Unicode。
现在的计算机的内存都是Unicode,硬盘都是utf-8
4、存储单位间的关系
八位二进制也叫8bit
8bit = 1Bytes
1024Bytes = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
在ASCII码表中,用八位二进制表示一个英文字符(也就是1Bytes),所有的英文的字符加特殊符号最多也就在125位左右;在GBK编码表中,用2Bytes表示一个中文字符,1Bytes表示一个英文字符,最多能表示65535个字符。在万国码Unicode中,统一用2Bytes表示一个字符。用户在输入的时候,无论输什么字符都能够兼容万国字符,其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系。
5、数据的存储过程
数据由内存保存在硬盘的过程:内存中的数据以unicode的形式存储,编码成utf-8的形式存到硬盘上。硬盘中的数据先解码成unicode的形式,再由内存读取到内存中。
保证数据存储和读取不乱码的关键在于文件以什么编码方式编码的就要以什么编码方式解码。
6、常用工具的编码方式
python2默认使用ASCII码读文件,python3默认使用utf-8读文件,pycharm终端使用的utf-8,windows终端使用的是gbk。若想改变工具的默认编码方式,可以选择在文件中加入头文件,放在文件的第一行,在头文件中写入想要使用得到编码方式。
二、文件处理
1、什么叫文件处理
将需要的数据保存在文件中,对文件中的数据进行读、写等操作。
2、文件打开的模式
文件打开的模式(mode)主要有三种,分别是只读(r)、只写(w)和追加模式(a)。
在三种基本模式 上又有读写(r+)、写读(w+)等模式。
文件可以以文本和二进制形式的操作:t为文本操作,b为二进制操作、
# mode参数 可以不写 不写的话默认是rt 只读的文本文件 这个t不写默认就是t with open(r'D:\Python项目\day07\a.txt',mode='r',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(f.read()) # 一次性将文件内容全部读出 with open(r'D:\Python项目\day07\1.jpeg',mode='rb') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(f.read()) # 一次性将文件内容全部读出 # r模式在打开文件的时候 如果文件不存在 直接报错 # 文件路径可以写相对路径 但是需要注意该文件必须与执行文件在同一层文件下 with open(r'a.txt',mode='r',encoding='utf-8') as f: with open(r'a.txt','r',encoding='utf-8') as f1: mode关键字可以不写 print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(">>>1:") print(f.read()) # 一次性将文件内容全部读出 print('>>>2:') print(f.read()) # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读 print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容 for line in f: # f可以被for循环 每for循环依次 读一行内容 print(i) # 这个方法 就可以解决大文件一次性读取占用内存过高的问题 print(f.readline()) # 只读取文件一行内容 print(f.readline()) print(f.readline()) print(f.readline()) # w模式:w模式一定要慎用 # 1.文件不存在的情况下 自动创建该文件 # 2.当文件存在的情况下 会先清空文件内容再写入 with open(r'xxx.txt',mode='w',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 f.write('不不不,你没有翻~\n') f.write('不不不,你没有翻~\n') f.write('不不不,你没有翻~\n') f.write('不不不,你没有翻~\r') f.write('不不不,你没有翻~') l = ['不sdffs,sdfs有翻~\n','不sdfsdf不,你sdfsf翻~\n','不sfad不,你没sa翻~\n'] f.writelines(l) # 上下等价 for i in l: f.write(i) # a模式 # 1.当文件不存在的情况下 自动创建该文件 # 2.当文件存在的情况下,不清空文件内容, 文件的光标会移动文件的最后 with open(r'yyy.txt',mode='a',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 f.write('我是小尾巴\n')View Code