二、字符编码、文件处理
目录
一、字符编码
二、文件处理
一、字符编码
掌握俩个结论:
#1.Python文件头需要指定编码 #2.python2 与python3在字符编码的区别
1.1 一个完整的计算机系统可分为三部分
#1.应用程序 #2.操作系统 #3.计算机硬件
cpu、内存、硬盘
1.2 文本编辑器读文件的过程:(notepad++,pycharm,word)
#1.先启动notepadd++,将软件加载到内存 #2.将硬盘中的文件内容读入内存 #3.打印到屏幕
1.3 运行python程序的过程
#1.先启动python解释器,(将软件加载到内存) #2.将test.py的内容读入内存(Python2默认读入编码是ascii码,Python3默认读入编码是utf-8) #3.解释执行(此时才有了python语法的概念)
1.4 什么是字符编码
人类字符---->数字(0和1)
字符编码就是一个由字符转成数字的一个标准
1.5 字符编码表
ASCII码:只有英文,还有键盘上所有符号,1个英文字母=8bit=1Bytes
GBK:中文、英文====>数字(0或1)
#1个中文字符==》2Bytes=16bit #1英文字符==》1Bytes=8bit
unicode:万国编码
一般情况:2个Bytes代表一个字符,无论是英文还是中文
utf-8:Unicode Transformation Format
1英文=1Bytes
1中文=3Bytes
1.6 字符编码结论:
#1.总结1 #python3解释器默认读取.py文件的编码:utf-8 #python2解释器默认的读取.py文件的编码:ascii 可以通过修改文件头的方式,修改默认的字符编码 #coding:utf-8 #2.总结2: #乱码问题出现的关键在于存文件的时候用一种编码,读文件用了另外一种编码 #保证不乱码的关键在于:文件以什么编码存的就应该以什么编码取
1.7 针对2.3运行python程序流程的第三个阶段:
解释执行
#文件头编码,在运行python程序流程的第三步,解释执行还会用到 #在Python2中 #coding:gbk x='上' #创建内存空间,将‘上’的unicode--编码成文件头编码gbk存放 print ([x]) #gbk编码的二进制,1个中文2Bytes,结果['\xc9\xcf'] #在Python2中 #coding:utf-8 x='上' print ([x]) #utf-8编码的二进制,1个中文3Bytes,结果['\xe4\xb8\x8a'] print (x) #在cmd下打印,乱码,因为要把值打印出来,就会把文件头utf-8解码成unicode,而cmd下默认是gbk #python2中的解决办法 #coding:utf-8 x=u'上' #直接创建内存空间时,不从unicode--转成--文件头编码,而是直接用unicode编码创建 #在Python3中,就默认都是unicode,因此不用再加u ps:字符串能用encode()方法,就是unicode类型,如x.encode('gbk'),x为unicode
encode()方法是将类型str按指定编码成bytes类型
decode()方法是将bytes类型按指定解码成str类型 总结:推荐使用Python3
#记住以下三点: #1.保证不乱码,就是以什么编码存,就以什么编码取 #2.Python3默认读文件解码是utf-8;Python2默认是ASCII码;建议是在文件头指定编码,pycharm会自动将.py存的时候也转换成对应的编码,保证实现第1点 #3.Python3里的字符串在内存里是unicode编码后的二进制;Python2当中的字符串在内存里是unicode--编码成---文件头编码的二进制结果,要想Python2的字符串在内存中也是以unicode存储,在字符串加个小u,eg:u'hello'
二、文件处理
# 文件对象=open(文件的路径,mode=文件的打开模式,encoding=字符编码) # 强调:下述操作涉及两方面的资源 #1、操作系统需要打开文件 #2、f就是一个python的变量 f=open(r'D:\code\SH_weekend_s1\day03\a.txt',mode='r',encoding='utf-8') data=f.read() f.close() # 回收操作系统打开的文件
打开文本文件指定编码: encoding='utf-8' 强调: 1.打开的文件必须是文本文件 2.encoding指定的字符编码一定要跟文件存时候用的编码一致 3.不指定encoding,默认使用操作系统默认编码读取或编码,如windows是gbk,linux是utf-8
#防止文件打开后未关闭用with,反斜杠\代表语句换行 with open('a.txt',mode='r',encoding='utf-8') as f,\ open('aaa.py',mode='r',encoding='utf-8') as f1: data=f.read() print(data)
############文件的打开模式############ #r:默认的打开模式,只读模式,文件不存在则报错 with open('a.txt',mode='r',encoding='utf-8') as f: print(f.readable()) #文件是否可读,返回True print(f.writable()) #文件是否可写,返回False f.write('hello') #报错 #读取已光标位置为准 with open('a.txt',mode='r',encoding='utf-8') as f: print('第一次') print(f.read()) #读取文件所有内容,光标在末尾 print('第二次') print(f.read()) #读取为空 #读取一行 with open('a.txt',mode='r',encoding='utf-8') as f: print(f.readline()) #按行读取,读第一行,光标移到下一行 print(f.readline()) #按行读取,读第二行,光标移到下一行 print(f.readlines()) #光标所在位置,按行读取作为元素,形成列表 #w:只写模式,文件存在则清空,文件如果不存在则创建 with open('b.txt',mode='w',encoding='utf-8') as f: print(f.readable()) #是否可读,返回False print(f.writable()) #是否可写,返回True f.write('你好啊,小帅哥\n') #写入内容,不会自动换行,需要\n换行 f.write('你好啊,小美女') #将info列表元素按行一一存入文件 #方法一: with open('b.txt',mode='w',encoding='utf-8') as f: info=['床前明月光\n','疑是地上霜\n','举头望明月\n','低头思故乡\n'] for line in info: f.write(line) #方法二:运用f.writelines(info) with open('b.txt',mode='w',encoding='utf-8') as f: info=['床前明月光\n','疑是地上霜\n','举头望明月\n','低头思故乡\n'] f.writelines(info) #将列表内的元素存入文件,不会自动换行,需要\n #a:只追加模式,文件存在指针直接移动到文件末尾;文件不存在则创建 with open('access.log',mode='a',encoding='utf-8') as f: print(f.readable()) #是否可写,返回False print(f.writable()) #是否可读,返回True f.write('5555555\n') #追加内容 f.write('666666\n') # 控制文件读写单位的有两种模式: #1、t:默认的模式 with open('c.txt',mode='wt',encoding='utf-8') as f: f.write('今天天气真好') #报错,除了文本,其他都不能用t模式 with open('1.png',mode='rt',encoding='utf-8') as f: f.read() #2、b:二进制模式,该模式下读写但都是bytes,该模式下不能指定encoding参数 with open('1.png',mode='rb') as f: data=f.read() print(data) print(type(data)) #bytes类型 #b模式下,读取【文本】文件内容需要指定解码格式 with open('c.txt',mode='rb') as f: data=f.read() print(data) print(data.decode('utf-8')) #将内容bytes二进制类型解码成utf-8 #b模式下,写入文件内容需要指定编码格式 with open('d.txt',mode='wb') as f: f.write('你好aaa\n'.encode('utf-8')) #将内容编码成'utf-8'保存 f.write('我好aaa\n'.encode('utf-8'))
#循环读取文件内容(实时显示文件新增的内容) import time with open('day03/access.log','rb') as f: f.seek(0,2) #第二个参数2:从文件末尾:1,从当前光标位置;0,从文件开头位置 while True: line = f.readline() if line: print (line.decode('utf-8').strip()) else: time.sleep(0.2) #不用疯狂读取文件追加的内容,间隔0.2秒
小程序:模拟复制文件功能
import sys print (sys.argv) if len(sys.argv) != 3: print ('python copyfile.py src_path dst_path') sys.exit() src,dst = sys.argv[1],sys.argv[2] #r'%s':使用r,防止路径有斜杠\被转义 try: with open(r'%s'%src,'rb') as f_src,\ open(r'%s'%dst,'wb') as f_dst: for line in f_src: f_dst.write(line) except Exception as e: print ('源文件不存在')
实现:修改文件内容的效果
#方法一:(代码简洁,但对文件大,对内存消耗大) with open('src.txt','r',encoding='utf-8') as f: data=f.read() data=data.replace('宇文护','杨坚') #方法二:(代码繁琐,但对内存消耗小) import os with open('src.txt','r',encoding='utf-8') as f1,\ open('src_temp.txt','w',encoding='utf-8') as f2: for line in f1: if '宇文护' in line: line=line.replace('宇文护','杨坚') f2.write(line) os.remove('src.txt') os.rename('src_temp.txt','src.txt')