您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何解决“ OSError:告诉位置被next()调用禁用的位置”

如何解决“ OSError:告诉位置被next()调用禁用的位置”

我有一个较旧的Python 3版本,并且在Linux而不是Mac上运行,但是我能够重新创建非常接近您的错误内容

IOError: telling position disabled by next() call

一个 IO 错误,而不是一个 操作系统 错误,但在其他方面是相同的。奇怪的是,我无法使用your引起它open('a+', ...),但仅当以读取模式打开文件时:open('r+', ...)

更令人困惑的是,错误来自_io.TextIOWrapper一个 似乎 在Python的_pyio.py文件中定义的类…我强调“出现”,因为:

TextIOWrapper文件中的的属性类似于_telling我无法调用调用它的what-it-is对象_io.TextIOWrapper

中的TextIOWrapper类在_pyio.py可读,可写或随机访问文件之间没有任何区别。两者都应该起作用,或者两者都应该提高相同IOError

无论如何,文件TextIOWrapper描述的类 。这似乎是您遇到的问题(评论是我的):_pyio.py

def __next__(self):
    # Disable the tell method.
    self._telling = False
    line = self.readline()
    if not line:
        # We've reached the end of the file...
        self._snapshot = None
        # ...so restore _telling to whatever it was.
        self._telling = self._seekable
        raise StopIteration
    return line

在您的tell方法中,您几乎总是break在迭代到达文件末尾之前就退出了迭代,并保持_telling禁用状态(False):

重置方法的另一种方法_telling是该flush方法,但是如果在进行迭代时调用方法,也会失败:

IOError: can't reconstruct logical file position

解决这个问题的办法,至少我的系统上,就是要上了TextIOWrapper,这一切都恢复到已知状态(成功调用flush在讨价还价中):

def tell(self, char=False):
    t, lc = self.f.tell(), 0
    self.f.seek(0)
    for line in self.f:
        if t >= len(line):
            t -= len(line)
            lc += 1
        else:
            break
    # Reset the file iterator, or later calls to f.tell will
    # raise an IOError or OSError:
    f.seek(0)
    if char:
        return lc, t
    return lc

如果这不是您系统的解决方案,那么它至少可以告诉您从哪里开始寻找。

PS:您应该考虑 始终 返回行号和字符偏移量。可以返回完全不同类型的函数很难处理—调用者丢弃自己不需要的值要容易得多。

其他 2022/1/1 18:35:09 有476人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶