1 文件操作流程
1 打开文件
对操作系统发起系统调用
要操作文件,需要获得文件的句柄。可以通过open()来获取文件的句柄。
f=open("file_path",mode="r",encoding="utf-8")
f就是文件的句柄
对文件的操作,也就是对句柄的操作。
encoding默认的是以系统默认的编码方式。(windows默认gbk,mac和linux默认utf-8)
## 2 操作文件
包括对文件的读和写。下面具体介绍
3 关闭文件
f.close()
python提供了另一个方法来避免忘记写close()的方法。
with open("file_path",mode="r",encoding="utf-8") as f
通过控制块的范围,当代码运行超出范围时,自动执行close()。推荐使用with as。
注意:文件内容在内存中,什么时候会写入磁盘?只有强制使用flush()刷新,手动调用close()或程序结束,内容会一次性从内存写入文件。
2 文件的操作具体内容
每一次使用open(),光标都会被重置到文件开头位置。
文件的操作,可以是对字符的操作和字节的操作。
1 文件的权限控制
r 字符可读,文件不存在报错
w 字符可写,文件不存在,创建
a 字符追加(append),文件不存在,创建
r+ 字符可读可写(读的时候,从光标(光标默认在开始)位置开始读,写的时候是从光标所在位置开始写) 文件不存在报错
w+ 字符可读可写(读是光标位置开始读(可通过seek调节位置),写的时候都是覆盖写) 文件不存在,创建
a+ 字符可读可写(光标默认在最后,必定在最后追加写) 文件不存在,创建
rb 二进制可读
wb 二进制可写
ab 二进制追加
rb+ 二进制可读可写
wb+ 二进制可读可写
ab+ 二进制可读可写
r+、w+、a+和rb+、wb+、ab+除了一个是处理字符,一个处理字节,其他特性都一样。这里我们只研究前3个处理字符的。
fd = open("111.txt",'w+')
w+模式是只要运行上面这条指令,如果111.txt,不存在就创建。如果存在,且里面有内容,则会直接执行清空。之后再执行读写操作。读是光标位置开始读(可通过seek调节位置),且只能在同一个文件句柄中读取出写入的内容(如下面这种,flush与否都能read出来“234”),写的时候都是覆盖写。
fd = open("111.txt",'r+')
fd.write("234")
#fd.flush()
fd.seek(0)
print(fd.read())
r+如果文件不存在,就直接报错。读的时候,从光标位置开始读(光标默认在开头),写的时候是从光标所在位置开始写(默认在结尾,追加写)。
fd = open("111.txt",'a+')
#fd.seek(0)
print(fd.read())
a+文件不存在,创建。读的时候从光标位置开始读(光标默认在末尾),写的时候必定在最后追加写。
2 字符的操作
- 文件的读
f.read() #一次性将文件的全部内容读入系统(文件过大,可能会报错)
f.read(5) #一次读5个字符(节)
f.readable() #判断可读权限
f.readline() #返回一行,后面有
,光标移动到下一行行首
f.readlines() #以列表的形式返回文件的所有行内容(不推荐使用)
for line in f #f是迭代器,每次只返回一条结果,不会因文件过大,而出现内存错误,优于readlines()
- 文件的写
f.write("abc") #把“abc”写到文件,并返回相应的字符(节)个数
f.writelines([list]) #一次写多行
f.truncate(3) #从光标位置开始向后截取3个字符
f.writable() #判断可写权限
f.flush() #强制把内存里的内容写入磁盘
一但文件写入磁盘,就不可能再向文件插入内容
- 重点:
光标的移动:
f.seek(0) #把光标移动到开头(按字节)
f.tell() #返回当前光标的位置
f.seek(3,0) #0表示光标从开头位置开始
f.seek(3,1) #1表示光标从当前位置开始向后移动3个字节
f.seek(-3,2) #2表示光标从结尾开始,-3表示向前移动3个字节。此处若为3,是说光标继续向后移动3个字节,会报错。
3 字节的操作
with open("111.txt","rb+") as f:
f.write("hello李".encode("utf-8"))