1.文件操作的模式
1.1控制文件读写操作的模式 r模式的使用
r(默认的):只读
w:只写
a:只追加写
r只读模式使用:在文件不存在时则报错,文件存在文件内指针直接跳到文件开头
#小练习:实现用户认证功能
inp_name = 'han'
inp_pwd = '123'
with open('db.txt',mode='rt',encoding='utf-8') as f:
for line in f:
u,p =line.strip('\n').stript(':')
if inp_name ==u and inp_pwd ==p:
print('登录成功')
break
else:
print('用户名或密码错误')
1.2 w模式的使用
w只写模式,在文件不存在的情况下会创建空文档,文件存在就会清空文件,文件指针跳到文件的开头
with open('b.txt',mode='w',encoding='utf-8') as f:
f.write('你好\n')
f.write('我好\n')
强调:
1.在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
2.如果重新以w模式打开文件,则会清空文件内容
1.3 a模式的使用
a只追加模式,在文件不存在的时,会创建空文档,文件存在将文件指针直接移动到文件末尾
w与a的异同: 相同点:在打开文件不关闭的情况下,连续的写入新的内容总在后面 不同点:以a模式重新打开时,不会清空原文件内容。指针也会移动到最末尾
2. 控制文件读写内容的模式
大前提:t,b模式均不能单独使用,必须与r/w/a之一结合使用
t(默认):文本模式
1.读写文件都是以字符串为单位的
2.只能针对文本文件
3.必须指定encoding参数
b:二进制模式
1.读写都是以bytes/二进制为单位
2.可以针对所有文件
3.一定不能指定encoding参数
2.1 t模式的使用
t模式:如果我们指定的文件打开模式为r/w/a,其实默认就是rt/wt/at
强调:t模式只能用于操作文本文件,无论读写,都应该以字符串为单位,而存取硬盘本质都是二进制的形式,
当指定t模式时,内部帮我们做了编码与解码
2.2 b模式的使用
b:读写都是以二进制为单位
with open('1.mp4',mode='rb') as f:
data = f.read()
print(type(data))
强调:
1.在操作纯文本方面t模式帮我们省去了编码与解码的环节,b模式则需要手动编码与解码,所以此时t模式更方便
2.针对非文本文件(如图片,视频,音频)只能使用b模式
#做一个拷贝程序
src_file = input('请输入你的源地址').strip()
dst_file = input('请输入你的目标地址').strip()
with open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1:\
open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2:
for line in f1:
f2.write(line)
3.操作文件的方法
读操作
f.read() 读取所有内容,执行完该操作后,文件指针会移动到文件末尾
f.readline() 读取一行内容,光标会移动到第二行首部
f.readlines() 读取每一行内容,存放于列表中
#强调
f.read()与f.readline()都是将内容一次性读入内存,如果内容过大会导致溢出,若还想将内容全读入内存,则必须分多次读入,有两种实现方式:
方式一:
with open('a.txt',mode='rt',encoding='utf-8') as f:
for line in f:
print(line) 同一时刻只读入一行内容到内存中
方式二:
with open('1.mp4',mode='rb') as f:
while True:
data=f.read(1024)
if len(data) == 0:
break
print(data)
4.主动控制文件内指针移动
f.seek(n,模式) n代表移动字节个数,模式分为0,1,2 f.seek(指针移动的字节数,模式控制) 0:默认的模式,该模式代表指针移动的字节数是以文件开头为参照的f.seek(3,0) 1:该模式代表指针移动的字节数以当前所在位置为参照 f.seek(20,1) 2:该模式代表指针移动的字节数以文件末尾的位置为参照f.seek(10,2) 强调:0模式可以在t和b模式下使用,而1和2只能在b模式下使用