文件操作补充
重点:
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 os
with 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)