Python3基础-文件操作的其他方法

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  则会把之前缓冲区的数据写入文件,文件内容会有内容显示

Python3基础-文件操作的其他方法

注意
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()
Python3基础-文件操作的其他方法
1 11
2 11223333
aa.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()
Python3基础-文件操作的其他方法
你
哈哈哈哈
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()相对位置

Python3基础-文件操作的其他方法
Hi
你好
123
aa.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

 

上一篇:C语言fseek()函数和ftell()函数


下一篇:Python -- seek定位文件指针位置 错误 io.UnsupportedOperation: can't do nonzero cur-relative seeks错误