当前位置: 首页 > 工具软件 > Seeks > 使用案例 >

python使用seek函数报错:io.UnsupportedOperation: can't do nonzero end-relative seeks

潘慈
2023-12-01

说明:Windows10 平台、使用pycharm进行调试

一、为什么使用seek()

因为在读取文件的时候,指针随之运动,当读取结束的时候,指针就移动到相应的位置了,如果想再次读取文件中某个位置的数据就得移动指针。


二、前言:

文件f.txt中内容如下;(该文件处于程序所属的同一个文件夹下面,如果使用的文件与程序不在同一个文件夹下,下面参数请传递文件的完整路径)

 you raise me up
 when i am down
 please help me
 lalalalala

三、seek()函数用法格式

seek的标准形式为 :seek(offset[,whence])

  • whence 默认值为0,表示从文件开头进行计算偏移量,这时候offset必须大于等于0
  • whence 如果为1,表示从当前位置开始计算偏移量,如果offence为负数,表示往前移动,为正表示往后移动
  • whence 如果为2,表示相对于文件末尾移动

四、测试代码

'''
使用seek   
'''

f = open("f.txt","rb") #如果使用seek,这里必须使用rb
print(f.readline(),end = " ")
print(f.tell()) #文件名.tell()   显示当前偏移量移动指针的位置

f.seek(0) #将指针的位置偏移量置为0,相当于把位置移动到开头
print(f.tell())
print(f.readline(),end = " ")
print(f.tell())

f.seek(-5,1) #以当前位置为准,往前移动五个
print(f.readline(),end = " ")

程序运行结果:
b'you raise me up\r\n' 17
0
b'you raise me up\r\n' 17
b' up\r\n'


五、错误分析

如果出现io.UnsupportedOperation: can't do nonzero end-relative seeks 这个错误,主要是因为在python3和python2的问题,如果该程序在Python2中是不会报错的,Python3则会报错。因为Pyhon3在文本文件中,没有使用b模式选项打开的文件,只允许从文件头开始计算相对位置,从文件尾计算时就会引发异常

六、解决方法

在开始使用open打开文件时候,将打开方式从r,换成rb即可
即:f = open("f.txt","rb") #如果使用seek,这里必须使用rb

 类似资料: