主动控制文件内指针移动

发布时间 2023-12-05 19:41:31作者: 苏苏!!

主动控制文件内指针移动

  • 文件内指针的移动时以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())#对于下内容解码  毅航