文件的基本操作;文件打开方式;文件操作的其他方法;控制文件指针移动 # day09
一、文件的基本操作
1、什么是文件
文件是操作系统提供给用户或者说是应用程序操作硬盘的一种功能。
2、为何要用文件
读写文件就是在读写硬盘:我们对文件的读写操作都会被操作系统转换成硬盘的读写操作。
应用程序——————文件对象、文件句柄
操作系统——————操作系统对硬件进行封装,硬盘最后封装为文件
硬件——————硬盘
3、如何用文件
1、打开文件
f = open(r'a.txt', mode='rt', encoding='utf-8') # 打开文件a.txt文件
print(f) # 这里的f就是文件对象(数据+功能open())、文件句柄
完整流程:1、应用程序给操作系统发出指令打开文件a.txt,操作程序会有一个指向a.txt的空间
2、返回值。
2、关闭文件
f.close() #回收操作系统的资源,操作系统是给很多个软件服务,不用的时候要关闭,减少占用的资源,f.close()后,打印print(f) ,文件对象依旧存在,输入命令f.read(),报错,此时应用程序和操作系统的绑定关系已经解除,若要再进行文件操作,可重新用open打开文件,进行操作。
3、回收资源
f.close() 关闭之后,f已没用处,可以del f 回收删除f或重新定义变量f 。若是f占用内存不大可以不删。(当变量f占用内存空间太大,且短时间不会从新定义f,才会使用del)
防止我们忘记close文件,用格式:with open(r'a.txt', mode='rt', encoding='utf-8') as f 代码 运行结束之后会with会自动调用f.close.
4、拓展知识
open()功能占用的资源有应用软件,操作系统。应用软件可以不管,但操作系统能打开的文件数目是一定的。 运维:系统优化:在Linux系统中‘ulimit’限制文件打开的数目,尽量调高。 开发人员:打开的文件要关。
二、文件打开模式
1、控制文件读写操作模式
r(默认)模式:只读模式,如果文件不存在则报错,文件存在时文件指针处于文件开头
w模式:只写模式,如果文件不存在则创建空文档,文件存在会清空,指针处于文件开头。w模式打开文件不关的情况下,连续的write写入,新写的内容永远跟在后面
a模式:只追加写模式,如果文件不存在则创建空文档,文件存在则不会清空文件,指针处于文件末尾。a模式打开文件不关的情况下,连续的write写入,新写的内容永远跟在后面。在打开了文件关闭重新打开的情况下,a模式永远写在后面
2、控制文件读写内容的模式
t模式:读写都是以字符串为单位的,只适用为文本文件,必须指定encoding参数。(mode=‘r’时,默认是mode=‘rt’)
b模式:读写都是以byte为单位的,适用于所有文件(文本,视频,音频。。。),一定不能指定encoding参数。txt文本文件可以解码decode,同样的types文件可以编码encode,其他种类文件不能解码
验证是否可读,可写分别用readable(),writable()
扩展.Ctrl+C,Ctrl+V(文件拷贝功能)的原理:
方案一:当所要拷贝的文件过大时,内存溢出,可能会复制不了
with.open('1.mp4',mode='rb') as f1,open(r'D:\11111.mp4',mode='wb') as f2: f2.write(f1.read())
方案二(优化):(一点一点读,不会溢出)
with.open('1.mp4',mode='rb') as f1,open(r'D\11111.mp4',mode='wb') as f2:
for line in f1:
f2.write(line)
三、文件操作的其他方法
f.readlines():功能相当于f.read(),不同在于:print(f.read())打印出来是字符串,print(f.readlines())打印出来是一个列表
f.readline():print(f.readline())是一行一行的读出来
f.writelines() :括号里的的变量必须是能够for循环的。 例:f.write('hello')与f.writelines('hello')写入的结果都一样,但是过程不同,f.write('hello')只写入一次结果为hello,而f.writelines('hello')写入了五次依次是‘h’,‘e’,‘l’,‘l’,‘o’,结果一样显示hello
f.flush():与f.write()关联使用。当f.write()写入的内容非常小的时候,操作系统并不会马上写入硬盘,这时f.flush()的作用就是下达指令让操作系统立马写入硬盘。
四、可读可写模式(一般不用)
r+t模式:write()写入时,指针指向末尾,新的内容永远跟在后面
w+t
a+t
r+b
w+b
a+b
5、控制文件指针移动
大前提:只有t模式下的,f.read(n)中的n代表的是字符个数,除此以外,关于指针的移动,单位都是字节bytes(在‘utf-8’中英文字母占一个字节,中文占三个字符)
f.truncate():截断一段文件内容,截断完成,之后的内容全部删除。此功能一般用于a,r+模式
f.seek移动的全都是字节个数
f.seek(字节个数, 0):这里的0参照的指针是文件开头
f.seek(字节个数, 1):这里的1参照的指针在文件的当前位置
f.seek(字节个数, 2):这里的2参照的指针是文件在尾部 #例:指针指在倒数前一个字节:f.seek(-1, 2)
ps:只有0模式下可以t使用,其中1和2模式只能在b模式下使用(0也可以在b模式下使用),但是无论在t模式下还是在b模式下,移动的都是字节个数。
扩展:f.tell()是告诉你你指针距离开头多少字节的位置。
tail程序实现:
import time
with open('a.txt',mode='at',encoding='utf-8')as f:
f.write("%s 郁子奇 200.103.110.22 ok\n" % time.strftime("%Y-%m-%d %H:%M:%S"))
with open('a.txt', mode='rb')as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
continue
else:
print(line.decode('utf-8'), end='')

浙公网安备 33010602011771号