file.closed
用于判断文件流信息是否关闭
f=open('a.txt','rt',encoding='utf-8') print("文件是否关闭",f.closed) f.close() print("文件是否关闭",f.closed)
执行结果如下
文件是否关闭 False 文件是否关闭 True
file.encoding
文件打开的编码
f=open('a.txt','rt',encoding='utf-8') print(f.encoding) #文件打开的编码 f.close() #print("文件是否关闭",f.closed) f=open('a.txt','rt',encoding='gbk') print(f.encoding) #文件打开的编码 f.close() f=open('a.txt','rt') print(f.encoding) #文件打开的编码 f.close()
执行结果如下:
utf-8 gbk cp936
File flush() 方法
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入
1、如果没有刷新文件内部缓存,打开文件test.txt,文件内容为空 2、如果刷新文件内部缓存;打开文件test.txt 则会把之前缓冲区的数据写入文件,文件内容会有内容显示
注意 1、tell、read、seek等文件内光标移动都是以字节为单位 2、特例:read(5)代表读取5个字符
file.tell() #获取光标当前位置
tell() 方法返回文件的当前位置,即文件指针当前位置。
#英文
f = open('aa.txt','r+',encoding='utf-8') # data = f.read() # print(data) f.write('11') print(f.tell()) #输出当前指针的位置 2 f.write('\n') print(f.tell()) #输出当前指针的位置 4 f.write('11223333') print(f.tell()) #输出当前指针的位置 12 f.close()
1 11 2 11223333aa.txt文件内容
f = open('aa.txt','r+',encoding='utf-8') # data = f.read() # print(data) f.write('你') print(f.tell()) #输出当前指针的位置 3 f.write('\n') print(f.tell()) #输出当前指针的位置 5 f.write('哈哈哈哈') print(f.tell()) #输出当前指针的位置 17 f.close()
你 哈哈哈哈aa.txt文件内容
b模式下的读取当前指针的位置
with open('aa.txt','r+',encoding='utf-8') as f: print(f.tell()) data = f.readline() print(f.tell()) data = f.readline() print(f.tell()) data = f.readline() print(f.tell()) with open('aa.txt','rb') as f: print(f.readlines()) """ 执行结果 0 5 7 19 [b'\xe4\xbd\xa0\r\n', b'\r\n', b'\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'] """
file.seek()
seek() 方法用于移动文件读取指针到指定位置
-
offset -- 开始的偏移量,也就是代表需要移动偏移的字节数
-
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起
#aa.txt的文件内容如下 你 哈哈哈哈
with open('aa.txt','r+',encoding='utf-8') as f: f.seek(0) #重新设置文件读取指针到开头 print(f.tell()) # 读取当前光标的位置 f.seek(3) print(f.tell()) print(f.read()) """ 执行结果 0 3 哈哈哈哈 """ #报错的例子--一个中文3个字节 with open('aa.txt','r+',encoding='utf-8') as f: f.seek(1) # 光标移至1个字节后面 print(f.tell()) #获取当前光标的位置 # 第一行的文本内容是:你 1个中文字符3个字节,光标移至第1个字节后,再读取文本内容就会报错 print(f.read()) # 报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte with open('aa.txt','r+',encoding='utf-8') as f: print(f.tell()) data = f.readline() #读取第一行文本内容 print(f.tell()) data = f.readline() #读取第二行文本内容 print(f.tell()) data = f.readline() #读取第三行文本内容 print(f.tell()) f.seek(0) #将光标重置文件开头 print(f.tell()) """ 执行结果 0 5 7 19 0 """
seek()相对位置
Hi 你好 123aa.txt文件内容
注意 使用seek()方法报错:“io.UnsupportedOperation: can't do nonzero cur-relative seeks”错误的原因 1、代码如下 with open('aa.txt','r+',encoding='utf-8') as f: #以读写的格式打开文件aa.txt print(f.tell()) f.seek(12,1) #从当前位置开始偏移12个字节 print(f.tell()) f.seek(3,1) print(f.tell()) seek中whence参数的值: 0:open函数以r,w,带b的二进制模式,就是以任何模式打开文件,都能正常运行 1和2:open函数只能以二进制模式打开文件,才能正常运行,否则就会报出上面的错误
#f.seek() 重新设置光标的位置,默认从文件开头开始算起 with open('aa.txt','r+',encoding='utf-8') as f: print(f.tell()) f.seek(10) print(f.tell()) f.seek(3) print(f.tell()) """ 执行结果 0 10 3 """ #f.seek() 设置为1 设置从当前位置开始算起 with open('aa.txt','rb') as f: print(f.tell()) f.seek(12,0) #从当前位置开始偏移12个字节 print(f.tell()) f.seek(3,1) #从当前位置开始偏移3个字节 print(f.tell()) """ 执行结果 0 12 15 """ #f.seek() 设置为2 设置文件末尾 with open('aa.txt','rb') as f: print(f.tell()) f.seek(12,2) #错误的方法:从文件末尾开始偏移12个字节 print(f.tell()) print(f.read()) #获取为空 f.seek(-12, 2) #正确的方法:从文件末尾开始偏移-12个字节 print(f.tell()) print(f.read()) #获取从文件末尾倒数12个字节后的内容 """ 执行结果
0
27
b''
3
b'\n\xe4\xbd\xa0\xe5\xa5\xbd\r\n123'
"""
file.read()
#aa.txt文件内容 """ 你好吖 哈哈哈哈 """ with open('aa.txt','r+',encoding='utf-8') as f: data=f.read(1) #读取第一个字符 print(data) f.seek(0) #重置光标的位置 data=f.read(2) #读取两个字符 print(data) """ 执行结果 你 你好 """
file.truncate()
truncate() 方法用于截断文件,如果指定了可选参数 size,则表示截断文件为 size 个字符。 如果没有指定 size,则从当前位置起截断;截断之后 size 后面的所有字符被删除。
size -- 可选,如果存在则文件截断为 size 字节。
#aa.txt文件内容 """ 你好吖 哈哈哈哈 """ with open('aa.txt','r+',encoding='utf-8') as f: #f.truncate(1) #截断第一个字节后所有字符,则文本内容显示只有一个字节的内容 f.truncate(3) #一个中文3个字节,则截断第一个中文后所有字符,则文本内容只保留 你
-------->
seek例子:读取文件的最后一行内容
代码如下
""" 输出为:文件最后一行 """ with open('aa.txt','rb') as f: #打开文件 first_line=f.readline() #读取第一行 off = -60 #设置偏移量[预估多少个字节] while True: f.seek(off,2)#文件末尾开始向前50个字符(-50) lines=f.readlines()#读取当前指针后面所有的内容 if len(lines) >=2:#判断是否最后至少两行 last_line = lines[-1] #读取最后一行 print(last_line.decode('utf-8')) break #如果off为-50时得到的readlines只有一行内容时,不能保证最后一行是完整的 #所以off 再次翻倍运行,直到 readlines不止两行 off += -60