什么是文件
一、文件是操作系统提供给用户/应用程序操作硬盘的一种虚拟的概念/接口
用户/应用程序(open())
操作系统(文件)
计算机硬件(硬盘)
二、]为何要用文件
用户/应用程序可以通过文件将数据永久保存到硬盘中
即操作文件就是操作硬盘
用户/应用程序直接操作的是文件,对文件进行的所有的操作,都是在向操作系统发送系统调用,然后再由操作系统将其转换成具体的硬盘操作。
三、如何用文件:open()
控制文件读写内容的模式:t 和b
T和 b 不能单独使用,必须跟r/w/a连用
T文本默认的模式
1、读写都以str(unicode)为主的
2、 文本文件
3、 必须指定encoding=”utf-8”
B 二进制/bytes
四、控制文件读写的模式
R 只读模式,w只写模式 a 追加模式 +:r+ ,w+ ,a+
T:1、读写都是以字符串(unicode)为单位
2、只能针对文本文件
3、必须指定字符编码,即必须指定encoding参数
B:binary模式
[if !supportLists]1、 [endif]读写都是以bytes为单位
[if !supportLists]2、 [endif]可以什对所有文件
[if !supportLists]3、 [endif]一定不能指定字符编码,即一定不能指定encoding参数
总结:
在操作纯文本文件方面t模式帮我们省去了编码与解码的环节,b模式则需要手动
编码与解码,所以此时t模式更为方便
针对非文本文件(如图片、视频、音频等)只能使用b模式
Withopen(r”a.txt”,”wb”) as f:
f.write(“你好hello”.encode(“gbk”))
withopen(r”f.txt”,”wb”) as f:
f.write(“你好hello”.encode(‘utf-8))
五、循环读取文件
方式一:自己控制每次读取的数据量
Withopen(r’text.jpg,”rb”) as f:
Res= f.read(1024)
Iflen(res) == 0:
Break
Print(len(res))
方式二:以行为单位读,当一行内容过长时会导致一次性坊入内容的数据量过大
Withopen(r”a.txt’,”rt”,encoding=”utf-8”) as f:
Forline in f:
Print(len(line),line)
Withopen(r’a.txt”,”rb”) as f:
Forline in f:
Print(line)
Withopen(r”test.jpg”,”rb”) as f:
Forline in f:
Print(line)
六、读相关操作
1、readline:一次读一行
With open(r”a.txt,”rt”,encoding=”utf-8”) asf:
#Res1= f.readline()
#Res2= f.readlinge()
#Print(res2)
WhileTrue:
Line= f.readline()
Iflen(line) == 0:
Break
Print(line)
2、readlines:
Withopen(r”g.txt”,”rt”,encoding=”utf-8”) as f:
Res= f.readlines()
Print(res)
强调:f.read()与f.readlines()都是将内容一次性读入内存,如果内容过大会导到内存溢出
七、写相关操作
f.writelines():
with open(“h.txt”,”wt”,encoding=”utf-8”) asf:
forline in l:
f.write(line)
八、控制指针移动
指针移动的单位都是以bytes/字节为单位
只有一种情况特殊:
T模式下的read(n),代表的是字符个数
With open(“a,txt”,”rt”,encoding=”utf-8”) asf:
Res= f.read(4)
Print(res)
f.seek(n,模式):n指的是移动的字节个数
模式0:参照物是文件开头位置
f.seek(9,0) 指针在开头,移动到了9的字节位置
f.seek(3,0) 指针回到开头,移动到了3的字节位置
模式1:参照物是当前指针所在位置
f.seek(9,1) 当前位置到9的字节上
f.seek(3,1) 在9的字节上再移动3个字节,也就是到了12的位置
模式2:参照物是文件末尾位置,应该倒着移动
f.seek(-9,2)
f.seek(-3,2)
注意:
只有在0模式可以在t下使用,1、2必须在b模式下用
示例:
Withopen(“a.txt”,”rb”) as f:
f.seek(9,0)
f.seek(3,0)
print(f.tell())
f.seek(4,0)
res= f.read()
print(res.decode(“utf-8”))