文件操作
本章节内容如下:
1、文件的打开模式
2、文件对象的方法
3、文件的关闭
4、文件的定位和读取
4.1、文件的定位
4.2、文件的读取
read()
readline() 读取一整行
readlines() 读取所有行
使用list(f)来读取
5、文件的写入
6、一个任务
7、作业
8、扩展阅读
1、文件的打开模式

open()
help(open) 可以查看到open()的帮助文档 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) #open()函数有很多参数,初学者只关注第一和第二个参数。 #第一个参数是传入的文件名,不带文件路径则表示打开当前路径下的文件 #第二个参数是指定的文件打开模式
open函数详解: 1. open()语法 open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]]) open函数有很多的参数,常用的是file,mode和encoding file文件位置,需要加引号 mode文件打开模式,见下面3 buffering的可取值有0,1,>1三个,0代表buffer关闭(只适用于二进制模式),1代表line buffer(只适用于文本模式),>1表示初始化的buffer大小; encoding表示的是返回的数据采用何种编码,一般采用utf8或者gbk; errors的取值一般有strict,ignore,当取strict的时候,字符编码出现问题的时候,会报错,当取ignore的时候,编码出现问题,程序会忽略而过,继续执行下面的程序。 newline可以取的值有None, \n, \r, ”, ‘\r\n',用于区分换行符,但是这个参数只对文本模式有效; closefd的取值,是与传入的文件参数有关,默认情况下为True,传入的file参数为文件的文件名,取值为False的时候,file只能是文件描述符,什么是文件描述符,就是一个非负整数,在Unix内核的系统中,打开一个文件,便会返回一个文件描述符。 2. Python中file()与open()区别 两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,而用open()打开文件,是用python的内建函数来操作,建议使用open
打开文件
#打开文件,获得文件句柄 f = open("record.txt") #默认以文本模式打开,只读模式 f = open("record.txt",'r')
文件操作的基本流程
文件操作其实可以分成三大部分: 1.打开文件,获取文件句柄并赋予一个变量 2.通过句柄对文件进行读与写的操作 3.操纵完毕后,关闭文件 下面是一个具体的示例程序: 1.操作完成后自动关闭文件的 with open(‘db’,'r')as f: data = f.read() #一次性将文件中的内容读从磁盘上加载到内存里面 data = f.readline() #每次只读取一行数据 data = f,write() #对文件进行写入的操作 2.需要手动关闭文件的 f = open('db','r') f.read() #对文件进行读取的操作 f.close() #关闭文件
文件打开模式总结
#1. 打开文件的模式有(默认为文本模式): r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容】 a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 #3. 了解部分 "+" 表示可以同时读写某个文件 r+, 读写【可读,可写】 w+,写读【可读,可写】 a+, 写读【可读,可写】 x, 只写模式【不可读;不存在则创建,存在则报错】 x+ ,写读【可读,可写】 xb
2、文件对象的方法

#掌握 f.read() #读取所有内容,光标移动到文件末尾 f.readline() #读取一行内容,光标移动到第二行首部 f.readlines() #读取每一行内容,存放于列表中 f.write('1111\n222\n') #针对文本模式的写,需要自己写换行符 f.write('1111\n222\n'.encode('utf-8')) #针对b模式的写,需要自己写换行符 f.writelines(['333\n','444\n']) #文件模式 f.writelines([bytes('333\n',encoding='utf-8'),'444\n'.encode('utf-8')]) #b模式 #了解 f.readable() #文件是否可读 f.writable() #文件是否可读 f.closed #文件是否关闭 f.encoding #如果文件打开模式为b,则没有该属性 f.flush() #立刻将文件内容从内存刷到硬盘 f.name
读取文件的每一行
1 f =open('C:\\Users\\acer\\Desktop\\ok.txt','r') 2 #指针先移动到文件的起始位置 3 print(f.seek(0,0)) 4 #打印出每一行,推荐使用 5 for each_line in f: 6 print(each_line) 7 8 #这个方法也一,但一般不推荐 9 line= list(f) 10 for each_line in line: 11 print(each_line)
3、文件的关闭
对文件进行操作后,数据都缓存在内存里,需要关闭文件后,才能保存到文件
#打开文件,获得文件句柄 f = open("record.txt") #默认以文本模式打开,只读模式 f = open("record.txt",'r') #对文件进行操作后,数据都缓存在内存里,需要关闭文件后,才能保存到文件 #关闭文件 f.close()
4、文件的定位和读取
4.1、文件的定位
文件内光标移动都是以字节为单位如seek,tell,truncate,所有必须在b模式下进行。(踩过的坑)
#文件指针,就是一个“书签”,起到文件定位的作用 #seek(offser,from) 方法有两个参数,表示从from 偏移 offset字节 # from 有三个参数 :0 代表文件的起始位置,1代表当前位置,2代表文件末尾,其中1和2必须在b模式下进行 f = open("record.txt",'rb') print(f.seek(0,0)) #将文件指针设置到文件的起始位置 print(f.seek(0,1)) #将文件指针设置到当前位置 print(f.seek(0,2)) #将文件指针设置到文件末尾 print(f.tell()) #查看当前文件的指针位置
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
4.2、文件的读取
read()
#打开文件,获得文件句柄 f = open("record.txt",'r',encoding='utf-8') print(f.read()) #读取所有 """ read(3): 1. 文件打开方式为文本模式时,代表读取3个字符 2. 文件打开方式为b模式时,代表读取3个字节 """ print(f.read(3)) # 5分钟 读取了三个字节
#打开文件,获得文件句柄 f = open("record.txt",'rb') print(f.read()) #读取所有 """ read(3): 1. 文件打开方式为文本模式时,代表读取3个字符 2. 文件打开方式为b模式时,代表读取3个字节 """ print(f.read(3)) # 5分钟 读取了三个字节
readline() 读取一整行
用于在文件中读取一整行,就是从文件指针的位置向后读取,直到遇到换行符(\n)结束。
#打开文件,获得文件句柄 f = open("record.txt",'r',encoding='utf-8') print(f.readline(2)) #读取第一行的前2个字节 print(f.readline()) #读取一整行,直到遇到换行符(\n)结束 #关闭文件 f.close()
readlines() 读取所有行
#打开文件,获得文件句柄 f = open("record.txt",'r',encoding='utf-8') b =f.readlines() #读取所有行 for i in b: print(i) #关闭文件 f.close()
使用list(f)来读取
#打开文件,获得文件句柄 f = open("record.txt",'r',encoding='utf-8') file = list(f) #print(file) for each_line in file: print(each_line) #关闭文件 f.close()
5、文件的写入
文件的写入,需要确保打开的模式有"w"或者"a",否则会出错
"w" 模式写入文件,此前的文件内容会被全部删除
"a"模式写入文件,表示追加(修改文件建议用"a"模式)
#追加模式 f = open("record.txt",'a',encoding='utf-8') f.write("这是一段待写入的数据") f.close() #再次打开 f = open("record.txt",'r',encoding='utf-8') print(f.read()) #可以查看到追加到末尾 f.close()
#覆盖模式 f = open("record.txt",'w',encoding='utf-8') f.write("这是一段待写入的数据") f.close() #再次打开 f = open("record.txt",'r',encoding='utf-8') print(f.read()) #可以查看只有写入的这一行数据 f.close()
6、一个任务
任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来: 小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”) 小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”) 文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6个文件(提示:文件中不同的对话间已经使用“==========”分割)
record.txt 文件
小客服:小甲鱼,今天有客户问你有没有女朋友? 小甲鱼:咦?? 小客服:我跟她说你有女朋友了! 小甲鱼:。。。。。。 小客服:她让你分手后考虑下她!然后我说:"您要买个优盘,我就帮您留意下~" 小甲鱼:然后呢? 小客服:她买了两个,说发一个货就好~ 小甲鱼:呃。。。。。。你真牛! 小客服:那是,谁让我是鱼C最可爱小客服嘛~ 小甲鱼:下次有人想调戏你我不阻止~ 小客服:滚!!! ================================================================================ 小客服:小甲鱼,有个好评很好笑哈。 小甲鱼:哦? 小客服:"有了小甲鱼,以后妈妈再也不用担心我的学习了~" 小甲鱼:哈哈哈,我看到丫,我还发微博了呢~ 小客服:嗯嗯,我看了你的微博丫~ 小甲鱼:哟西~ 小客服:那个有条回复“左手拿著小甲魚,右手拿著打火機,哪裡不會點哪裡,so easy ^_^” 小甲鱼:T_T ================================================================================ 小客服:小甲鱼,今天一个会员想找你 小甲鱼:哦?什么事? 小客服:他说你一个学生月薪已经超过12k了!! 小甲鱼:哪里的? 小客服:上海的 小甲鱼:那正常,哪家公司? 小客服:他没说呀。 小甲鱼:哦 小客服:老大,为什么我工资那么低啊??是时候涨涨工资了!! 小甲鱼:啊,你说什么?我在外边呢,这里好吵吖。。。。。。 小客服:滚!!!
7、作业
[课后作业] 第028讲:文件:因为懂你,所以永恒 | 课后测试题
8、扩展阅读

浙公网安备 33010602011771号