1、字符编码python
字符编码针对的是文字,字符编码只跟文本有关,这里不须要考虑视频、音频等其余文件。windows
人在操做计算机的时候输入的是人能看懂的字符,可是计算机只能识别010101这样的二进制数据,那么就须要用字符编码表来处理字符与数字的对应关系。编码
最先的是ASCII表,用八位二进制表示一个英文字符,可是它只能表示英文和一些符号,不适合中文。因此中国本身出了一个GBK编码格式,用2Bytes表示一个中文字符。基于上面的推导,每一个国家的文字都不同,那么用的编码格式也不同,若是要相互使用就很方便。因此出了一个万国码unicode,统一用2Bytes表示全部字符。spa
unicode有两个特色:1.由于全部字符都是用2Bytes表示字符,因此会浪费不少存储空间。2.io次数增长,程序运行效率下降(这个是致命的)操作系统
后面针对这两个特色进行修改:当内存中的unicode编码格式数据存在硬盘的时候,会按照utf-8编码。将unicode的英文字符由原来的2Bytes变成1Bytes。将unicode中文字符由原来的2Bytes变成3Bytes。code
如今的计算机:视频
内存是unicode对象
硬盘是utf-8blog
须要掌握的:内存
unicode的两个特色:
1.在用户输入的时候,不管输入什么字符都可以兼容万国字符
2.其余国家编码的数据由硬盘读到内存的时候unicode与其余国家的编码都有对应的关系。
数据由内存存到硬盘:
1.内存中的unicode格式二进制数据 >>>经过编码(encode)>>> 硬盘中utf-8格式的二进制数据
2.硬盘中utf-8格式的二进制数据 >>>经过解码(decode)>>> 内存中unicode格式的二进制数据
咱们要清楚文件为何会乱码:由于文件存的格式和读取的格式不同(******)
x = '上' #第一种方法: # res1 = bytes(x,encoding='utf-8') # print(res1,type(res1)) # res2 = str(res1,encoding='utf-8') # print(res2,type(res2)) #第二种方法 res = x.encode('utf-8') print(res) #b'\xe4\xb8\x8a' print(type(res)) #<class 'bytes'> print(res.decode('utf-8')) #上
这里有个python2和python3的不一样点:
python2:将py文件按照文本文件读入解释器默认使用ASCII码
python3:将py文件按照文本文件读入解释器中默认使用utf-8
文件头:# coding:utf-8 在py文件开头写这个文件头,编码格式会自动转为这个
补充:1.pycharm终端使用的是utf-8格式
2.windows终端采用的是gbk
字符编码总结:
咱们用代码来举例:
x = '上'
res1 = x.encode('utf-8') #将unicode编码变成能够存储和运输的utf-8的二进制数据
res2 = res1.decode('utf-8') #将硬盘中utf-8格式的二进制数据解码成unicode格式的二进制数据
2、文件操做
文件处理包括三个步骤: 打开(open) /读写(read,write)/ 关闭(close)
# 经过python代码操做文件 # r取消转义 f = open(r'D:\Python项目\day07\a.txt',encoding='utf-8') # 向操做系统发送请求 打开某个文件 # 应用程序要想操做计算机硬件 必须经过操做系统来简介的操做 print(f) # f是文件对象 print(f.read()) # windows操做系统默认的编码是gbk f.read() # 向操做系统发请求 读取文件内容 f.close() # 告诉操做系统 关闭打开的文件
用open打开的文件必定要记得写close关闭
上面的这种操做方法比较复杂,因此出了文件上下文操做
with open 的方法,这个用法不用写close,还能够同时打开几个文件。
with open(r'D:\Python项目\day07\a.txt',encoding='utf-8') as f ,\ open(r'D:\Python项目\day07\b.txt',encoding='utf-8') as f1: # f仅仅是一个变量名 你把它当作是一个遥控器 print(f) print(f.read()) print(f1) print(f1.read())
文件打开模式:
r 只读模式 默认的模式
w 只写模式
a 追加写模式
操做文件单位的方式:
t 文本文件 默认的,能够不用写,在操做文本文件的时候,必定要指定encoding参数,若是不添加encoding参数默认是操做系统的默认编码(gbk)
b 二进制数据文件(好比视频,音频文件) 若是用了这个就不要写encoding参数
r 只读模式
r模式在打开文件的时候,若是文件不存在直接报错
有三种读取方式:read,readline,readlines
read:一次性将文件所有读取,返回的数据是字符串格式,缺点是若是文件太大,会占满内存
readline:读取文件内容的一行,返回的数据也是字符串格式
readlines:每一行每一行的读,每一行当成一个字符串,全部数据放在一个大列表当中
#读取文本文件用rt with open(r'D:\Python项目\day07\a.txt',mode='rt',encoding='utf-8') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(f.read()) # 一次性将文件内容所有读出
for i in f: #f能够被for循环 每for循环一次,就读取一行内容
print(i) #这个方法能够解决一次性读取文件占用内存过大的问题
#读取二进制文件用rb with open(r'D:\Python项目\day07\1.jpeg',mode='rb') as f: print(f.readable()) # 是否可读 print(f.writable()) # 是否可写 print(f.read()) # 一次性将文件内容所有读出 print(f.read()) # 读完一次以后 文件的光标已经在文件末尾了,再读就没有内容了可读 print(f.readlines()) # 返回的是一个列表 列表中的一个个元素对应的就是文件的一行行内容
w 只写模式(这个模式要慎用,若是文件自己有内容的话,写入的时候会被清空)
1.当文件不存在的时候,会自动建立文件
2.当文件存在的时候,先清空文件内容,而后再写入
有三种写入方式:write/writeline/writelines
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.当文件存在的状况下,不清空文件内容,文件光标会移动到文件的最后,在原有的基础上追加
a模式不可读,只能写
with open(r'yyy.txt',mode='a',encoding='utf-8') as f: print(f.readable()) # 是否可读 False print(f.writable()) # 是否可写 True f.write('我是小尾巴\n')
具体的详细内容能够参考:http://note.youdao.com/noteshare?id=17303322fcbc09a85d9bd5195dec25ae&sub=F9D47851E02B4CB7A341119637EC6BAE