Python3基础-文件操作的其他方法
发布时间:2020-12-20 10:14:46 所属栏目:Python 来源:网络整理
导读:file.closed ?用于判断文件流信息是否关闭 f=open( ‘ a.txt ‘ , ‘ rt ‘ ,encoding= ‘ utf-8 ‘ ) print ( " 文件是否关闭 " ,f.closed)f.close() print ( " 文件是否关闭 " ,f.closed) 执行结果如下 文件是否关闭 False文件是否关闭 True file.encoding
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‘,encoding=‘utf-8‘) print(f.encoding) #文件打开的编码 f.close() #print("文件是否关闭",f.closed) f=open(‘a.txt‘,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()?方法返回文件的当前位置,即文件指针当前位置。 #英文 1 11 2 11223333 f = open(‘aa.txt‘,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() 你
哈哈哈哈
b模式下的读取当前指针的位置 with open(‘aa.txt‘,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‘xe4xbdxa0rn‘,b‘rn‘,b‘xe5x93x88xe5x93x88xe5x93x88xe5x93x88‘] """ file.seek()?seek()?方法用于移动文件读取指针到指定位置
#aa.txt的文件内容如下 你 哈哈哈哈 with open(‘aa.txt‘,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‘,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‘,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
你好
123
注意 使用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‘,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‘,2) #错误的方法:从文件末尾开始偏移12个字节 print(f.tell()) print(f.read()) #获取为空 f.seek(-12,2) #正确的方法:从文件末尾开始偏移-12个字节 print(f.tell()) print(f.read()) #获取从文件末尾倒数12个字节后的内容 """ 执行结果 0 file.read()#aa.txt文件内容 """ 你好吖 哈哈哈哈 """ with open(‘aa.txt‘,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‘,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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |