文件操作:
重点:
1,文件操作的三步骤:打开文件 使用文件 关闭文件
2,文件操作的三要素:文件源 操作模式 编码
3,with语法 : with open() as 别名,open () as 别名:
4,重点方法 :read() write() readline() close() f.flush() f.seek()
操作模式
主模式:r w a
从模式:b t +
操作方法:
read() readline() readlines()
write() writelines() flush()
光标 seek() tell()
特征:encoding closed()
了解:readable() writeable()name
操作文件步骤;
1,打开文件
? f 被程序持有,文件被操作系统持有
? f = open(‘file.txt‘,‘r‘,encoding=‘utf-8‘)
? del f
? f.close()
2,操作文件
? f.read()
3,关闭文件
? f.close()#####操作系统对文件的持有权 一定要在文件操作完毕后释放
with open(‘file.txt‘,‘r+‘,‘utf-8‘) as f: date = f.read(6)####指定读取的字节数 print(date) message1 = f.read(2)#####在当前位置接着在读2个字节 print(message1) line1= f.readline()###读取一行 print(line1) lines = f.readlines()#####将所有的行一次性读出来,读出来之后返回的是一个列表 列表的元素是每一行的字符串 with open (‘file.txt‘,‘w+‘,‘utf-8‘) as w:? print(w.readable())? print(w.writeable())? w.write(‘456\n‘)? w.flush()###当数据量过大时,可以手动将内存中的数据刷新到硬盘中? w.writelines([‘000\n‘,‘111\n‘,‘222\n‘])? ### ?
在 r read 读模式下,文件必须提前存在,如果不存在 会报错
文件操作
#打开文件f = open(r‘文件路径‘,‘文件的操作模式‘,encoding = ‘utf-8‘)#使用文件f.read()f.write()#关闭文件f.close()#基础读#文件操作模式:r 1,按字符经行操作2,read() 读所有内容, read(10) 指定读取字符长度3,readline() 一次读一行4,readlines() 将文件一行一行读到list中f = open(r‘文件路径‘,‘r‘,encoding = ‘utf-8‘)读模式下,操作文件 文件必须提前存在,否则会报错w 模式下,操作文件 ,如果文件不存在,则会自动创建,文件存在,就会清空重新写?
基础写
文件操作模式:w 文件不存在就新建,存在就清空
1.按照字符经行操作
2,write(‘写入第一行\n写入第一行\n‘)
3,flush()将之前写入到内存中的数据写入到硬盘中
4,writelines(list):list中存放的是一条条文件内容,需要明确\n标识换行
writelines([‘111\n‘,‘222\n‘])
with 语法
操作系统对文件的持有权由with自动管理释放
with open 语法
with open (‘file.txt‘,‘r‘,‘encoding=‘utf-8‘) as f:
? date=f.read()
? print(date)
操作模式
主模式
r:文件必须存在的读
w:文件无需存在的写,无创建,有清空再写
a:文件无需存在的写,无创建,有再文件最后追加写
从模式
t:按文本字符操作数据(默认模式)
b:按文本字节操作数据
+:可读可写
了解:
X:新建文件写,如果文件已经存在,则抛出异常
注:主模式可以单独使用,单独使用一个主模式时,默认的从模式时t,文本模式。从模式必须依赖主模式 才能使用。从模式中,t 和b时相互对立的,二者不可以同时使用,从模式可以选择一个或者两个。主模式选择一个,这样的组合方式有很多中,可读可写追加写at+
#追加模式with open(‘file.text‘,‘a‘,encoding = ‘utf-8‘) as f : f.write(‘123\n‘) print(123) f.write(‘456\n‘) f.flush() f.write(789\n)
字节方式操作文件
b操作模式下,不需要指定encoding,原因时b能对所有类型数据经行操作,包括文本视频音频
而utf-8只是文本文件的编码方式
数据在硬盘中本就是以二进制经行存储的,所以b默认操作就是对数据从硬盘到数据的拷贝
但是如果数据要展现给用户,文本文件就要涉及到解码,其他文件需要通过专业工具打开
with open (‘file.txt‘,‘rb‘) as f : date = f.read() print(date) #但如果数据要展现给用户,文本文件就要涉及到解码,其他文件也是如此 print(date.decode(‘utf-8‘)) ## r+ 从头开始写,、a+ 从最后开始追加写 w+清空从零开始写
一般读一个文件,写一个文件,一般不在同一个文件中边读边写
文件操作常用的步骤是数据的上传与下载,一般最多的是图片或者excell
#操作模式#主模式‘‘‘r:文件必须存在的读W:文件无需存在的写,有则清空开始写,没有则创建空文件开始写a:文件无需存在的写,无创建,有在文件后面追加写‘‘‘#从模式‘‘‘t:按照文本字符操作数据(默认方式)b:按文本字节操作数据+:可读可写?注:主模式可以单独使用,单独使用一个主模式时,默认的从模式时t,文本模式。从模式必须依赖主模式 才能使用。从模式中,t 和b时相互对立的,二者不可以同时使用,从模式可以选择一个或者两个。主模式选择一个,这样的组合方式有很多中,可读可写追加写at+可以搭配出来的组合有rt wt at rb wb ab rt+ wt+ at+rb+ wb+ ab+‘‘‘
游标操作
大前提:游标操作一定要在b模式下进行操作,因为游标一定按字节进行偏移
seek(偏移量,操作位置)
操作位置:0:从头开始,1从当前位置开始,2从最后位置开始
with open(‘file.txt‘,‘rt‘,encoding=‘utf-8‘) as f:
? d1 = f.read(7)
? print(d1)
? d2 = f.read(2)
? print(d2)
大前提:seek一定在b模式下经行操作,因为seek移动是按照字节经行操作
open(‘file.txt‘,‘wt+‘,encoding = ‘utf-8‘) as f:f.seek(偏移量,操作位置)f.seek(5,0) #从开始往后移5个字节f.seek(-1,1)# 从当前位置向后偏移1个字节f.close(1,1)#从当前位置向后偏移一个字节f.seek(-5,2)#从末尾向前偏移5个字节?‘‘‘seek(num1,num2)这个移动游标的方法提供了两个位置的参数,第一个位置表示移动的字节数,正数表示向后移动,负数表示向前移动,第二个位置的参数表示移动起始游标的位置,0表示从最开始最前面的位置开始移动,1表示从当前的位置开始移动,2表示从最后面结尾的位置开始移动‘‘‘‘
修改文件
rb 在当前位置经行 覆盖书写
ab+ 可以操作游标,但只对读起作用,写仍然是最后追加
文件的修改不能用ab+ 只能用wb+
with open (‘change.txt‘,‘rb+‘) as f: date = f.read() newDate = date.decode(‘utf-8‘).replace(‘16‘,‘016‘) f.seek(0,0) f.write(newDate.encode(‘utf-8‘))
复制文件
复制文件也就是将一个文件中的内容,读好之后,在写入另一个文件中:
with open (‘old.txt‘,‘r‘,encoding = ‘utf-8‘) as f1,open(‘new.txt‘,‘w‘,encoding = ‘utf-8‘) as f2: #文件的循环 for line in f1:####对可读文件对象直接遍历循环,得到的是一行行内容 print(line)? ###复制一张图片?import oswith open (‘001.png‘,‘rb‘) as f1,open(‘002.png‘,‘wb‘) as f2: for line in f1: f2.write(line)os.remove(r‘D:\pythonstudy\execise\homework\day3\001.png‘)
秒传案例
####计算得到秒传依据with open (‘002.png‘,‘rb‘) as f : date = f,read() #print(date) length = len(date) print(length) # 设置秒传算法,1 截取部分字节 2 加密字节得算法 # 1,从头开始读10个字节 中间读10个字节 末尾读10个字节 # 2,将所有数据经行拼接 f.seek(0,0)####把光标移到最前面最开始的位置 d1 = f.read(10) f.seek(length//2,0) d2 = f.read(10) f.seek(-10,2)###将光标移到最后末尾倒数10个字节 d3 = f.read(10) mk = d1 +d2 +d3 print(mk)#####实现秒传with open (‘002.png‘,‘rb‘) as f : new_mk =b‘‘ f.seek(0,0) new_mk +=f.read(10) f.seek(length//2,0) new_mk += f.read(10) f.seek(-10,2) new_mk +=f.read(10)if new_mk == mk: print(‘秒传‘)else: print(‘老老实实慢慢传吧‘)
文件的遍历
##最常用读写得操作。直接将一个文件的内容复制都另一个文件中with open(‘source‘,‘r‘,encoding = ‘utf-8‘) as f1,open(‘target‘,‘w‘,encoding = ‘utf-8‘) as f2: for line in f1: f2.write(line)
原文地址:https://www.cnblogs.com/1832921tongjieducn/p/10652450.html