一、文件内指针移动的规则
1.文件内指针移动的都是要bytes字节为单位
2.只有一种情况特殊:t模式(文本文件)下的read(n),是以字符为单位
案例:t模式下的读取
如有文本文件名为aaa.txt,其中内容为:aaa你好呀
with open(r‘aaa.txt‘,mode=‘rt‘,encoding=‘utf-8‘) as f:
res = f.read(4) #d读取字符的个数
print(res) # 打印结果
打印结果:aaa你
案例:b模式下的读取
with open(r‘aaa.txt‘,mode=‘rb‘) as f:
res = f.read(6) # b模式下以字节为单位,一个应为为一个字节,一个汉字为3个字节
print(res)
打印结果:b‘aaa\xe4\xbd\xa0‘ # b表示以bytes为字节,\xe4\xbd\xa0表示三个字节(一个汉字三个字节)
二、主动控制文件内指针移动
在之前学习中的文件指针移动都是以读写操作而被动触发的,如果想读取文件某一特定的位置,则需要用f.seek(指针移动的字节数,控制模式)
语法:f.seek(n,控制模式) # n表示移动的字节数,控制模式如下详解
模式模式
0模式:默认的模式,代表指针移动的字节数是以文件开头为参照物
1模式:代表指针移动的字节数是以当前指针所在位置为参照物
2模式:代表指针移动的字节数是以文件末尾为参照物,应该倒着移动
注意:其中0模式可以再t或者b模式使用,但是1和2模式只能在b模式下使用
1. 0模式详解案例:参照物为文件开头
如有文本文件名为aaa.txt,其中内容为:aaa你好呀
案例一:
with open(r‘aaa.txt‘,mode=‘rb‘) as f:
f.seek(3,0) # 指针移动到3个bytes的位置,以0模式读(以文件的开头为参照物)
print(f.tell()) #f.tell()表示获取文件指针当前的位置
打印结果:3 # 表示文件指针当前的位置为3,即当前文件指针距离文件开头的位置为3
案例二:
with open(r‘aaa.txt‘,mode=‘rb‘) as f:
f.seek(3,0) # 指针移动到3个bytes的位置,以0模式读取
res = f.read() # 读取当前位置以后的内容,即从第3个字节后开始读取内容
print(res.decode(‘utf-8‘)) #打印出res,并且解码(文件存的时候字符编码为utf-8,这里读取如果不解码就会以字节的方式打印出来)
打印结果:你好呀
2. 1模式详解案例:参照物为文件当前位置
如有文本文件名为aaa.txt,其中内容为:aaa你好呀
案例一:
wiht open(r‘aaa.txt‘,mode=‘rb‘) as f:
f.seek(3,1) # 以当前文件指针读取3个字节(第一次读取当前文件指针在首尾)
f.seek(6,1) # 以当前文件指针读取5个字节(上面已经读取了3个字节,这是指针位置应该在3,在读取6个字节,指针应该在9)
print(f.tell()) # 打印当前文件指针的位置
打印结果:9 # 打印出当前文件指针位置在9的位置
案例二:
with open(r‘aaa.txt‘,mode=‘rb‘) as f:
f.seek(3,1)
f.seek(6,1)
res = f.read()
print(res.decode(‘utf-8‘))
打印结果:呀 # 第一次指针当前为值为首尾,移动3个字节,第二次指针移动6个字节是在第一次的基础上在移动6个字节,所以为9个字节
一个英文为1个字节,中文为3个字节,所以第一次移动3个字节在aaa后面,在移动6个字节在“好”后面,在读取后面的字节
3. 2模式详解案例:参照物为文件末尾,倒着移动
如有文本文件名为aaa.txt,其中内容为:aaa你好呀
案例一:
with open(r‘aaa.txt‘,mode=‘rb‘) as f:
f.seek(-3,2) # 从文件末尾开始读取,向前读取3个字节,-3表示倒着移动3个字节
print(f.tell()) # 打印文件当前指针的位置
打印结果:9 # 从文件末尾向前移动3个字节,前面就还有9个字节,所以指针移动到9个字节的位置
案例二:
with open(r‘aaa.txt‘,mode=‘rb‘) as f:
f.seek(-3,2)
res = f.read()
print(res.decode(‘utf-8‘))
打印结果:呀 # 从文件末尾移动3个字节,到了第9个字节的位置,“aaa你好”刚好为9个字节,从第9个字节向后读取,所以打印出来为“呀”