文件操作
一、文件基本操作
打开文件方法:open
f = open("test",encoding="")
r:只读模式(只能读取文件,不能做写操作,文件不存在时会报错)
w:只写模式(只能做写操作不能做读操作,而且会清空文件后,写入,文件不存在时会自动创建)
a:追加模式(在文件最后增加内容,只能写入,不能读取文件)
rb:以二进制的方式读取文件,不能指定编码格式
wb:以二进制的方式写入文件,不能指定编码格式
ab:以二进制的方式追加,同样不能指定编码格式
r+:读写模式,不会清空源文件,当只有wrire操作时,会从文件的开始地方进行覆盖写操作
w+:写读模式,先清空源文件的内容,当写操作完成后,文件指针在最后一个字符的位置,读操作为空,需要指定指针位置才能读内容
a+:追加读模式,不会清空源文件,追加操作完成后,也需要指定指针位置才能读取内容。
不指定打开方式时默认为只读模式,不指定编码规则时,默认为系统的编码格式
文件操作方法
1、f.read()按字符读取所有内容,并返回一个内容的字符串形式,如果指定一个整形的参数,读取定长的内容,换行符作为一个字符
1 f = open("test","r",encoding="utf8") 2 a = f.read()#读取所有,返回的是字符串 3 print(a) 4 print(type(a)) 5 6 7 sunqilalalala 8 1111 9 22223 10 tgsg 11 <class 'str'>
1 print(f.read(10))#读取10个字符 2 3 sunqilalal
2、f.readline()读取文件的一行
1 print(f.readline())#每次只读取一行 2 3 sunqilalalala
3、f.readlines()读取文件的所有行,返回一个列表
1 f = open("test","r",encoding="utf8") 2 a = f.readlines()#一次读取所有行 3 print(a) 4 5 ['sunqilalalala ', '1111 ', '22223 ', 'tgsg']
4、f.write()文件写操作,写入一个字符串到文件中,不会自动写入换行符
1 f = open("test","w",encoding="utf8") 2 f.write("sunqi ")#写操作会覆盖源文件,然后写入新的内容,文件不存在就会创建,需要手动添加换行 3 a = f.write("你好 ")#返回写入的字符的个数一般是字符串的长度 4 f.write("hello ") 5 print(a) 6 f.close()
5、f.writelines()写入一个元素为字符串的序列化对象,不会自动写入换行符
1 f = open("test","w",encoding="utf8") 2 3 b = f.writelines(["1","2","3","4"])#返回值为none 4 print(b) 5 f.close()
6、f.tell()显示当前文件光标所在的位置
7、f.seek()移动光标到指定位置
1 f = open("test","a+",encoding="utf8")#每次对文件追加之后,文件指针都在最后,把指针置位零就可以正常读取了 2 3 print(f.tell()) 4 f.seek(0) 5 print(f.readlines()) 6 print(f.tell())
f.seek(10,0)可以更改光标的位置(要求以b的方式发开)。默认从文件开始的位置计算
0代表默认模式,可以不指定
1代表相对模式
2代表倒序模式
8、ff.lush()将内存中的数据刷入到硬盘
9、f.truncate()截取文件的部分内容然后覆盖的存储在文件中,要求只能以写的模式打开,但是不能是w,w+
10、f.close()关闭文件操作
11、应用:如何优雅快速读取大文件的最后一行?
1 f = open("test","r") 2 for i in f: 3 offs = -10 4 while True: 5 f.seek(offs,2)#指针倒放,然后正常读取,当读取超过一行是data的长度为大于等于2,断定最后一行已经读完,取出即可 6 data = f.readlines() 7 if len(data)>1: 8 print(data[-1]) 9 break 10 else:#最后一行没读完或最后一行杠读完,不确定于是在扩大读的范围 11 offs = offs * 2