文件操作高级指针移动

seek指针移动
文件的高级操作:控制文件指针的移动
seek(n,模式) 移动文件读取指针到指定位置。
指针移动的单位都是以bytes/字节为单位

只有一种情况特殊:
t模式下的read(n),n代表的是字符个数

seek(n,模式)
n:字节数 负数的字节数会从右往左走
模式0:参照物是文件开头位置(默认的模式)
模式1:参照物是当前指针所在位置
模式2:参照物是文件末尾位置,应该倒着移动

强调:只有0模式可以在t下使用(1,2模式用在t模式下会报错)

文件操作高级指针移动



# 指针移动的单位都是以bytes/字节为单位
# 只有一种情况特殊:
# t模式下的read(n),n代表的是字符个数

# with open('aaa.txt',mode='rt',encoding='utf-8') as f:
# res=f.read(4)
# print(res)

# f.seek(n,模式):n指的是移动的字节个数
# 模式:
# 模式0:参照物是文件开头位置
# f.seek(9,0)
# f.seek(3,0) # 3

# 模式1:参照物是当前指针所在位置
# f.seek(9,1)
# f.seek(3,1) # 12

# 模式2:参照物是文件末尾位置,应该倒着移动
# f.seek(-9,2) # 3
# f.seek(-3,2) # 9

# 强调:只有0模式可以在t下使用,1、2必须在b模式下用

# f.tell() # 获取文件指针当前位置

# 示范
# with open('aaa.txt',mode='rb') as f:
# f.seek(9,0)
# f.seek(3,0) # 3
# # print(f.tell())
# f.seek(4,0)
# res=f.read()
# print(res.decode('utf-8'))



# with open('aaa.txt',mode='rb') as f:
# f.seek(9,1)
# f.seek(3,1) # 12
# print(f.tell())


# with open('aaa.txt',mode='rb') as f:
# f.seek(-9,2)
# # print(f.tell())
# f.seek(-3,2)
# # print(f.tell())
# print(f.read().decode('utf-8'))


# rb+
# with open('a.txt','rb+') as f:
# 0模式
# f.seek(3,0)
# f.write(b'abc') # abc
# f.seek(0,0)
# res = f.read()
# print(res) #b'x00x00x00abc'

# 1模式
# f.seek(3,1)
# f.write(b'aaa') # aaa( 把原来的覆盖掉)
# f.seek(0,1)
# res = f.read()
# print(res) #b'x00x00x00aaa'

# 2模式
# f.seek(3,2)
# f.write(b'bbb') # aaa bbb(指针在末尾然后又跳了3个字节才开始写)
# f.seek(-3,2)
# res = f.read()
# print(res) #b'bbb'(2模式指针在末尾本来是读不到东西的,然后让他反向移动会读到3个字节)
# wb+
# with open('b.txt','wb+') as f:
# 0模式
# f.seek(3,0)
# f.write(b'abc') # abc
# f.seek(0,0)
# res = f.read()
# print(res) # 把上面写操作注释掉再运行的话会得到 b'',因为w模式会清空文件内容,同时运行会得到b'x00x00x00abc'

# 1模式
# f.seek(3,1)
# f.write(b'aaa') # aaa
# f.seek(-3,1)
# res = f.read()
# print(res) #指针移动-3才会得到 b'aaa',如果把写的代码注释掉,负数的指针移动会报错

# 2模式
# f.seek(3,2)
# f.write(b'bbb') # bbb
# f.seek(-3,2)
# res = f.read()
# print(res) # b'bbb'
# 总得来说wb+在读操作前没有写入的话永远读不到内容

# ab+
with open('c.txt','ab+') as f:
# 0模式
# f.seek(3,0)
# f.write(b'abc') #abc
f.seek(-1,0)
res = f.read()
print(res)