python3.x Day3 文件操作
文件操作:
操作文件实际是4步骤
1、描述文件是哪个 2、打开文件 3、操作文件 4、关闭文件
1、打开文件使用open方法,代码举例:
data=open("wait_you",encoding="utf-8").read() #这样不规范,打开文件后读取了全部行,不是把读出的行存成对象 #1、没有关闭文件 #2、应该存成一个文件对象
f=open("wait_you",encoding="utf-8") #变量f就叫文件句柄也叫文件对象,属性有:文件名,字符集,文件大小,文件在硬盘上的起始位置。
文件打开模式:
#文件打开方式 f=open("wait_you",mode="r",encoding="utf-8")#这个实际开发中用的最多,文件按照只读方式打开,可读不可写,一般读取行就写 for line in f:这样的循环读取就可以了,效率最高 f=open("wait_you",mode="w",encoding="utf-8")#这个实际开发中用的最多,文件按照只写方式打开,可写不可读,一般修改文件配合上一种打开方式一起使用。 f=open("wait_you",mode="r+",encoding="utf-8") #这个是有实际开发意义的,模式为r+ 读写 可读可写,但实际上是读在开头,写在末尾,也就是追加readline、seek方法无法影响写的位置 f=open("wait_you",mode="w+",encoding="utf-8") #这个实际用的并不多,模式为w+ 写读 可写可读,但readline、seek方法无法影响写的位置 f=open("wait_you",mode="a+",encoding="utf-8") #这个实际用的也不多,模式为a+ 追加读,可读可写 f=open("wait_you",mode="rb") #二进制文件的读取模式,没有encoding属性了。用途:网络传输只能用进制,打开音频视频等等文件,也只能用二进制模式打开 f=open("wait_you",mode="wb") #二进制文件的写入模式,没有encoding属性了。用途:网络传输只能用进制,打开音频视频等等文件,也只能用二进制模式打开 f=open("wait_you",mode="wb") f.write("hello world".encode("utf-8")) #当前编码要写在这里,不然会用当前默认的编码。 f.close() #这里的二进制不是指无法人无法读,而是底层直接可以使用的二进制,然后,人在读文件,一般软件都有二进制编码的支持,所以还是可读的
2、操作文件
文件对象提供的各种方法:
#文件对象有各种方法 data = f.read() #读取全部行的方法read data2=f.read() #data、data2都读取全部行,理论上两个变量所存内容一致。 #实际上 data有内容,data2没有内容,原因是: #文件读取,python打开文件后,会维护一个文件行级的类似指针的标记,data2之所以没有数据,就是因为,data读完数据后,标记放在文件最后,所以data2再读读就读不出了,后续没有行了 #readline() 读取一行 #readlines() 读取每一行,存成一个list #最高效的逐行读取 f=open("wait_you",mode="r",encoding="utf-8") #高效的逐行读,这是最快的,用的迭代器 for line in f: print(line) f.tell() #指针位置,按照字符记录 f.read(5) #可以指定读取5个位置 f.seek(0)#回到文件开头,也可以回到其他位置(tell方法得出的值) f.encoding #获取当前打开文件的文件编码。 f.name #返回文件名 f.isatty()#返回文件是否为一个设备文件,底层交互用。True False f.seekable() #返回文件是否可以移动光标位置,设备文件都不能移动的,True False f.readable() #返回文件是否可以读取,True False f.writable() #返回文件是否可以写入,True False f.flush()#重要,刷盘,写入到缓存就算成功了,啥时候写入磁盘,依赖操作系统,或python调度,但flush 就强制刷入磁盘。 f.truncate() #重要,截断,不写参数就清空文件,参数是数字,也就是tell返回的文件位置数字,从那个位置开始往后的都干掉了,seek与truncate无关,都是从头往后数多少个位置
3、关闭文件
f.close() #关闭文件,非常重要,对文件操作完成,所有打开过的文件,都要分别执行close方法,不然内存容易崩掉!!!!
4、修改文件
#由于磁盘结构和读写方式导致,只能有一下两种方式进行修改文件内容 #1、文件全部读入内存,进行修改,再回写到文件 #2、逐行读文件,写新文件 #遇到需要修改的行,就修改,然后改后写入新文件。 o_file = open("wait_you",mode="r",encoding="utf-8") n_file = open("wait_you_1",mode="w",encoding="utf_8") for o_line in o_file: if "柠檬草" in o_line: o_line=o_line.replace("柠檬草","王玥大哥") #replace方法是字符串对象的方法,用于替换,第二个参数,替换第一个参数,第三个参数是个数字,描述最多替换几次 n_file.write(o_line) o_file.close() n_file.close()
5、with用法:
#with用法: #python2.7以后的版本,出现了with关键字,作用是避免打开文件后忘记close的情况, #with会在使用文件后,就自动调用close方法关闭这个文件: with open("wait_you",mode='r',encoding='utf-8') as f: for line in f: print(line) #以上代码高效的打印了每行,并且会自动close打开的文件,很好 #with也支持打开多个文件: #为了可读性,严格遵循python的开发规范(官方),每行不超过80个字符 with open("wait_you",mode='r',encoding='utf-8') as f , \ open("hello_world",mode='r',encoding="utf-8") as u : for line_1 in f: print(line_1) for line_2 in u: print(line_2)
6、模拟进度条??? 深刻体会flush方法的意义
import sys,time for i in range(50): sys.stdout.write(">>") #sys.stdout是对应屏幕的标准输出 sys.stdout.flush() #写这行执行,和不写这行执行,差别还挺大的。 time.sleep(0.3) #写了flush方法,屏幕会显出每一个进度“>>”的输出 #不写flush方法,等一会才输出,而且一次输出了好多个: #原理是python认为写入操作系统的文件操作接口就完成了,后续由操作系统具体调度何时写入磁盘,写入磁盘的过程,可以是以下情况: #1、缓存生命周期到了,写入磁盘。 #2、接受到写入磁盘指令,写入磁盘,例如:python的flush()方法 #3、缓存空间存满了,写入磁盘。 #4、使用缓存的程序结束了,写入磁盘(待考证,做实验的层面观察是这样的。)