一、文件操作
对文件的操作分三步:
1、打开文件获取文件的句柄,句柄就理解为这个文件
2、通过文件句柄操作文件
3、关闭文件。
现有以下文件test:
文件基本操作:
1 f = open(r'test',encoding='utf-8') #打开一个文件,默认为只读模式(r可以不写) 2 # print(f.read()) #获取文件里面的所有内容 3 # print('readline:',f.readline()) #读取文件第一行的内容,返回字符串对象 4 # print('readlines',f.readlines()) #获取文件里面所有的数据,每一行的数据放到一个list里面 5 6 f.close() #关闭文件
1、打开文件的模式
# r,只读模式(默认)。【只能读,不能写;文件不存在会报错】 # w,只写模式。【不可读;不存在则创建;存在则覆盖以前文件的内容】 # a,追加模式。【不可读; 不存在则创建;存在则只追加内容】 # r +,【可读、可写;可追加,如果打开的文件不存在的话,会报错】 # w +,【写读模式,使用w + 的话,已经存在的文件内容会被清空,可以读到已经写的文件内容】 # a +,【追加读写模式,不存在则创建;存在则只追加内容;】
#追加模式下,读和写的时候焦点始终在文件的末尾,除非使用函数seek()强制调整
#只要沾上r,文件不存在肯定会报错 #只要沾上w,文件内容肯定会被清空 # rb 以二进制读模式打开,"b"表示处理二进制文件 # wb 以二进制写模式打开 # ab 以二进制追加模式打开
2、读取文件的三个方法:read()、readline()、readlines()
read()方法:
1)读取整个文件的内容,将所有内容放到一个字符串变量中
2)若文件大于可用内存,不可能使用这种处理
readline()方法:
1)readline()每次读取一行
2)readline()返回的是一个字符串对象,保存当前行的内容
readlines()方法:
1)读取所有文件内容,返回一个list,元素是每行的数据,包括换行符
2)大文件时不要用,因为会把文件内容都读到内存中,内存不够的话,会把内存撑爆
3、写操作
常用的写入函数为write(str),writelines(list[str])
1)写入的必须是字符串,writelines()写入字符串列表
2)写入的内容不会自动添加换行符,必须显示写入换行符
#写 # f = open(r'test', 'w',encoding='utf-8') # f.write("test") #追加 names = ["xx","dd","hh"] f = open(r'test', 'w',encoding='utf-8') f.writelines(names) #传一个list,然后把list里面的每一个元素写入到文件中
4、文件其他操作方法
f = open('test', 'r+', encoding='utf-8') # encoding参数可以指定文件的编码 f.tell()#获取当前文件的指针指向 f.seek(0)#把当前文件指针指向哪 f.fulsh()#写入文件后,立即从内存中把数据写到磁盘中(缓冲区:内容写的数据放在缓冲区,缓冲区满了后再写入到磁盘) f.truncate()#清空文件内容 f.close()#关闭文件
5、读取文件的高效方法
read()和readlines()方法操作文件,会先把文件所有内容读到内存中。这样的话,内存数据一多会非常卡。高效的操作,就是读一行操作一行,读过的内容就从内存中释放了
f = open('test',encoding='utf-8') for line in f: #直接循环文件对象,每次循环的时候就是取每一行数据 print('line:',line) #这样的话,line就是每行文件的内容,读完一行的话,就会释放一行的内存
6、自动关文件(使用with)
使用with,它会在使用完这个文件后自动关闭该文件,使用方式如下:
#with 自动关文件 with open('test','r+') as f: f.read() f.write('uuuuuuu') # # #打开多个文件,用逗号隔开 # with open('test','r+') as f,open('test1','w',encoding='utf-8') as fw: # f.read()
7、文件修改(两种方式)
第一种:简单粗暴直接
1)先获取到文件里面所有的内容
2)然后修改内容
3)清空原来文件里面的内容
4)重新写入
f = open('test','a+',encoding='utf-8') f.seek(0) data = f.read() #文件指针到了最后 new_data = data.replace('你','you') f.seek(0) f.truncate() #清空文件内容 f.write(new_data) f.flush() f.close()
第二种:高效的方法
1)先打开原来的文件,再打开一个空文件
2)循环处理原来文件里面每一行数据,处理完之后,写到新文件里面
3)把原来的文件删除,把新文件的名字改成原来文件的名字
#1、前面的空格 #2、把空行去掉 #3、你替换you #4、写到新文件里 #5、把原来的文件删除,把新文件的名字改成原来文件的名字 import os with open('test',encoding='utf-8') as fr,open('.test','w',encoding='utf-8') as fw: for line in fr: #循环文件,读取每一行 line = line.lstrip() #去掉每一行的左边的空格 if line: #判断此行是否为空,不为空继续进行后面的操作 new_linel = line.replace('你','you') fw.write(new_linel) os.remove('test') os.rename('.test','test')