Day 09 文件操作
什么是文件
文件是操作系统系统的虚拟单位,我们操作文件就是对操作系统发起请求,然后由操作系统将用户或应用程序对于文件的读写操作转换成对硬盘的读写操作
如何操作文件
- 打开文件
- 读写数据
- 保存文件
- 关闭文件
python程序控制文件
- read 一次性读取数据
fr = open(file,mode='r',encoding='utf-8') #打开文件
print(fr.read()) #一次性读取所有的内容
fr.close()
- readline 读取一行,如果读完了所有数据,指针会移到文件末尾,再次读取则为空
fr = open(file,mode='r',encoding='utf-8') #打开文件
print(fr.readline()) #一次读取一行内容
fr.close()
- read模式打开文件
- 读取文件内容,向操作系统发起读的请求,汇报操作系统转成具体的硬盘操作,将内容由硬盘读入内存
- 由于python的垃圾回收机制只回收引用计数为0的变量,但是打开文件还占用操作系统的资源,所以我们需要回收操作系统的资源
- del fr只是回收变量,我们必须使用fr.close()关闭文件
- write模式打开文件
fw = open(file,mode='w',encoding='utf-8') #打开文件,并清空文件
fw.write(写入的数据) #写入数据
fw.close() #关闭文件
- append模式打开文件
fa = open(file,mode='a',encoding='utf-8') #打开文件,贯标移至文件末尾
fa.write(写入的数据) #写入数据
fa.close() #关闭文件
绝对路径和相对路径
绝对路径:从根目录开始,一直到你需要的文件路径
相对路径:从单签文件夹开始,当你需要的文件路径,只需要输入文件路径,要打开的文件必须和运行的py文件必须得在同一个文件夹下
文件的三种打开方式
- mode='r' 只读
- mode='w' 只写,清空文件再写入
- mode='a' 追加,再后面追加写入文件
- mode='rt' 只读打开text文本类型
- mode='rb' 只读打开bytes类型,二进制,b模式读写文件时,一定不能加上encoding参数,因为二进制无法在编码
- r:路径前面加一个r是用来告诉我们接下来的字符串中,里面所有的特殊字符都变的无意义
- t和b不能单独使用,必须和r/w/a一起使用;r/w/a能单独使用
文件的高级应用
- 可读可写
r+t 可读 可写
w+t 可写 可读
a+t 可追加, 可读 - 文件内的指针移动
假设我们需要在文件的内容中间的某一行增加内容,如果使用基础的r/w/a模式是非常难实现的,因此我们需要对文件内的指针进行移动
1.seek(offset,whence):offset代表文件指针的偏移量,单位是字节
2.tell():每次统计都是从文件开头到当前指针所在位置
3.read(n):只有在模式下的read(n),n代表的是字符个数,除此之外
4.truncate(n):trucate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果,它的参照物永远是文件头,并且truncate()不加参数,相当于清空文件.
上下文管理工具:with open()
with open方法可以使用逗号分隔,同时打开多个文件,实现文件的快速拷贝
with open(file,mode,encoding) as f1,\
open(file,mode,encoding) as f2:
修改文件内容的两种方式
文件的数据是存放于硬盘上的,因此只存在覆盖,不存在修改,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘
- 一次性读取所有:将硬盘存放的改文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘
import os
with open(filename1) as fr, open(filename2) as fw:
data=fr.read()
data=data.replace(需要修改的内容)
fw.write(data)
os.remove(filename1)
os.rename(filename2,filename1)
- 逐行读取:将硬盘存放的改文件的内容一行一行的读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os
with open(filename1) as fr, open (filename2) as fw:
for line in fr:
line=line.replace(需要修改的内容)
fw.write(line)
os.remove(filename1
os.rename(filename2,filename1)
在总而言之,修改文件的内容思路为:一度的方式打开源文件,以写的方式打开一个新的文件,吧源文件的内容进行修改,然后写入新文件,之后利用OS模块的方法,吧源文件删除,重命名新文件为源文件名,达到修改的效果