当前位置: 首页 > 知识库问答 >
问题:

用f.next()迭代时倒回多行

濮赤岩
2023-03-14

从这个问题跟进。如何修改此代码以允许多行倒卷?

class rewindable_iterator(object):
    not_started = object()

    def __init__(self, iterator):
        self._iter = iter(iterator)
        self._use_save = False
        self._save = self.not_started

    def __iter__(self):
        return self

    def next(self):
        if self._use_save:
            self._use_save = False
        else:
            self._save = self._iter.next()
        return self._save

    def backup(self):
        if self._use_save:
            raise RuntimeError("Tried to backup more than one step.")
        elif self._save is self.not_started:
            raise RuntimeError("Can't backup past the beginning.")
        self._use_save = True

共有1个答案

陈开宇
2023-03-14

这是我想出的解决办法:

from collections import deque
class rewindable_iterator(object):
    not_started = object()

    def __init__(self, filename,deque_max_length=2):
        self._f=open(filename,'r')
        self._iter = iter(self._f)
        self._use_save = False
#        self._use_save2 = False
        self._save = self.not_started
        self._use_num=0
        self._deque=deque([],deque_max_length)

    def __iter__(self):
        return self
    def __enter__(self):
        return self
    def readline(self):
        return self._iter.readline()

    def __exit__(self,exc_type, exc_value, traceback):
        if exc_type is not None:
            print exc_type, exc_value, traceback
        self._f.close()

    def next(self):
        if self._use_save:
            self._use_num -= 1
            if not self._use_num:
                self._use_save = False
            return self._deque[-self._use_num-1]
        else:
            self._save = self._iter.next()
            self._deque.append(self._save)
            return self._save

    def backup(self,num=2):

        if self._use_num+num>len(self._deque):
            raise RuntimeError("Tried to backup more than the available lines")
        elif self._save is self.not_started:
            raise RuntimeError("Can't backup past the beginning.")
        self._use_save = True
        self._use_num+=num
 类似资料:
  • 问题内容: 当您使用f.next()遍历文件时,Python的f.tell无法正常工作: 看起来它为您提供了缓冲区的位置,而不是您通过next()获得的位置。 以前,我在使用readline()遍历文件时曾使用过seek / tell技巧来倒退一行。使用next()时是否有一种方法可以快退一行? 问题答案: 否。我将创建一个适配器,该适配器在很大程度上转发所有呼叫,但在执行时保留最后一行的副本,然

  • 在spark中使用mapPartitionsToPair/PairFlatMapFunction时,我在Internet上找到了一个类似的例子 但当康普利 我找到了的声明 所以调用应该是返回一个迭代器。 因此,有人能帮助我如何返回在javaRDD api火花迭代器?谢谢 PS:我试过下面这样的代码,但在集群上不起作用:

  • 问题 你想同时迭代多个序列,每次分别从一个序列中取一个元素。 解决方案 为了同时迭代多个序列,使用 zip() 函数。比如: >>> xpts = [1, 5, 4, 2, 10, 7] >>> ypts = [101, 78, 37, 15, 62, 99] >>> for x, y in zip(xpts, ypts): ... print(x,y) ... 1 101 5 78 4

  • 问题内容: 假设您具有以下数组: 您将如何将其转换为XML字符串,使其看起来像: 一种方法是通过类似如下的递归方法: 我正在寻找一种使用迭代的方法。 问题答案:

  • 我有一个返回: 然后另一个用户这样使用它: 如何处理任何迭代中的失败情况? 我知道我可以使用,在这种情况下,错误结果将被忽略: 的迭代器根据成功状态具有0或1项,如果为0,将过滤掉它。 但是,我不想忽略错误,而是想让整个代码块停止并返回一个新错误(基于映射中出现的错误,或者只是转发现有错误)。 在Rust中如何最好地处理此问题?

  • 首先,我使用Jalali/波斯日期和倒计时jQuery插件对我不起作用。对于ex,插件必须输入公历日期,如2017/5/2,但波斯/贾拉利日期是1396/2/17。 我有多个datetime,指定了天、小时、分钟和秒。例: 3天13小时4分25秒 23天2小时41分3秒... 我有几天、几小时、几分钟和几秒时间, 我想在一页上为他们的日期倒计时(他们的日期是白天的) 当页面中只有一个日期时,我使用