文件操作(open\read\write\close)
为了方便演示,我们建立了一个示范文本,如下所示:
hello,我是代码螺丝钉
test1
test2
test3
文件的读
f = open("示范文本","r") #打开文件,获取句柄 v1 = f.read() #通过句柄进行读操作 print(v1) #打印结果为nicodeDecodeError: 'gbk' codec can't decode byte,报错了 f.close() #关闭文件
以上程序报错了,原因是因为示范文本这个文件的编码格式是utf-8,而open这个函数解码默认为系统的解码,我们操作系统默认为GBK编码,以下进行解决
f = open("示范文本","r",encoding="utf-8") #打开文件,获取句柄,设置以utf-8解码 v1 = f.read() #通过句柄进行读操作 print(v1) #打印结果为 # hello,我是代码螺丝钉 # test1 # test2 # test3 f.close() #关闭文件
如上所示,加入encoding=“utf-8”后可以解决解码错误的问题,如果我们想要读取一行如何做呢,答案是使用readline()
f = open("示范文本","r",encoding="utf-8") #打开文件,获取句柄,设置以utf-8解码 print(f.readline(),end="") #读取一行,end =""代表忽略回车,要不然打印会多打印一行空行 print(f.readline(),end="") print(f.readline(),end="") print(f.readline(),end="") print(f.readline(),end="") f.close() #关闭文件 #打印结果为 # hello,我是代码螺丝钉 # test1 # test2 # test3
还有一个函数为readlines(),下面来演示其效果
f = open("示范文本","r",encoding="utf-8") #打开文件,获取句柄,设置以utf-8解码 print(f.readlines()) #读取结果,最后存入一个列表中,每个元素代表一行 f.close() #关闭文件 #打印结果为['hello,我是代码螺丝钉\n', 'test1\n', 'test2\n', 'test3']
以上发现上面代码的效果就是读取所有行,然后建立一个列表,每一行的内容作为列表的一个元素
文件的写
文件的写可以完全类比文件的读,以下是示例代码
f = open("示范文本","w",encoding="utf-8") #打开文件,获取句柄,设置以utf-8解码 f.writelines(["1111","2222\n,3333\n"]) #传入列表,一次写多行 f.write("4444\n5555\n") f.close()
最后写出来的文本如下所示
11112222
,3333
4444
5555
文件的其他模式
- a 追加模式,不会覆盖文件,而是写到文件最后
- r+ 可读写模式,写操作默认从文件开头开始写
如何不用自己手动close,而让操作系统自己帮我们取关闭文件呢,答案是使用with关键字
with open("示范文本","w",encoding="utf-8") as f: f.write("4444\n5555\n")
文件的seek操作
我们在windows中进行文本编辑时候,有一个光标|一直闪烁,用于定位当前的文本编辑位置,对应文件操作就是seek,以下为seek函数的用法
with open("示范文本","rb") as f: #要使用seek的其他选项,必须要用二进制打开 f.seek(2) #从开头算起绝对位置的2 print(f.tell()) # 打印结果为2 f.seek(3,1) #相对于当前位置2 偏移3 # 打印结果为5 print(f.tell()) f.seek(-1,2) #从结尾12 算起后退1 print(f.tell()) # 打印结果为11
文件的flush操作、truncated操作
对于这两个操作,这里就不贴代码了,但是需要对其进行一下讲解
flush操作的目的:平常我们使用write函数进行写,实际上是在内存中写,并没有真正写入到硬盘中,当我们关闭文件的时候才会真正写入,但是如果我们写到一半的时候就想把内存中的内容存入硬盘,就可以调用flush函数
truncated操作本质上是写,打开一个文件,然后使用truncated函数对其进行切片操作