文件的基本操作;文件打开方式;文件操作的其他方法;控制文件指针移动 # 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='')

 

posted @ 2021-08-14 16:34  Gnomeshghy  阅读(589)  评论(0)    收藏  举报