主动控制文件内指针移动
- 文件内指针的移动时以Bytes为单位的,但是在t模式下时read(n),n以字符美单位的。
#文件内指针的移动时以Bytes为单位的,但是在t模式下时read(n),n以字符美单位的
with open('02.txt','rt',encoding='utf-8')as f:
res=f.read(3)#hel 读取三个字符
print(res,type(res))#<class 'str'>
with open('02.txt','rb')as f:
res=f.read(3)#b'hel'
print(res,type(res))#<class 'bytes'>
seek移动指针
- 之前文件内指针的移动都是由读/写操作而被动触发的。
- 若想读取文件某一特定位置的数据,则需要用f.seek()方法主动控制文件内指针的移动,详细用法如下:
- f.seek(指针移动的字节数,模式控制):
-
模式控制:
- 0: 默认的模式,该模式代表指针移动的字节数是以文件开头为参照的
- 1: 该模式代表指针移动的字节数是以当前所在的位置为参照的
- 2: 该模式代表指针移动的字节数是以文件末尾的位置为参照的
强调:
- 其中0模式可以在t或者b模式使用,而1跟2模式只能在b模式下用
(1)0模式详解
- 注意:
- 由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败。
- 在b模式下,要对读取的二进制数据进行解码
# 0模式
# #t 模式下
# with open('02.txt','rt',encoding='utf-8')as f:
# f.seek(3,0)#光标从开始移动了三个字节
# print(f.tell())#3 当前光标距离开头的位置为3
# print(f.read())#苏毅航 从光标位置读取到末尾
# 注意:由于在t模式下,会将读取的内容自动解码,所以必须保证读取的内容是一个完整中文数据,否则解码失败
# #b 模式下 要对读出的二进制数据进行解码
# with open('02.txt','rb')as f:
# f.seek(3,0)#光标从开始移动了三个字节
# print(f.read().decode('utf-8'))#苏毅航 从光标位置读取到末尾
(2)1模式
- 只能在b模式下使用
- b模式下读取数据时,要对读取的数据进行解码
# #1模式
# # b模式
# with open('02.txt','rb')as f:
# # f.seek(6,1)#光标从当前位置移动到第6个字节后
# # f.tell()#距离开头的位置有6个字节
# # print(f.tell())#6
# # print(f.read())#读取余下的字符 b'\xe6\xaf\x85\xe8\x88\xaa'
# f.seek(3,1)#光标从开始位置移动了3个字节
# print(f.tell())#距离开头位置有3个字节
# print(f.read())#读取余下的内容 b'\xe8\x8b\x8f\xe6\xaf\x85\xe8\x88\xaa'
# print(f.read().decode())#对于下内容解码 苏毅航
(3)2模式
- 只能在b模式下使用
- b模式下读取数据时,要对读取的数据进行解码
# #2模式
# #b模式
# with open('02.txt','rb')as f:
# # f.seek(0,2) #参照物为末尾,移动了0个字节,还在末尾
# # print(f.tell())#12 距离开头的位置有12个字节
# # print(f.read())#读剩下的内容 b''
# f.seek(-6,2)#从末尾向前移动了6个字节
# print(f.tell())#距离开头有6个字节
# print(f.read())#读取余下内容 b'\xe6\xaf\x85\xe8\x88\xaa'
# print(f.read().decode())#对于下内容解码 毅航
标签:移动,读取,read,模式,print,主动,指针
From: https://www.cnblogs.com/suyihang/p/17877996.html