当前位置: 首页 > 面试题库 >

Python:使用f.next()进行迭代时倒退文件中的一行

卓雅达
2023-03-14
问题内容

当您使用f.next()遍历文件时,Python的f.tell无法正常工作:

>>> f=open(".bash_profile", "r")
>>> f.tell()
0
>>> f.next()
"alias rm='rm -i'\n"
>>> f.tell()
397
>>> f.next()
"alias cp='cp -i'\n"
>>> f.tell()
397
>>> f.next()
"alias mv='mv -i'\n"
>>> f.tell()
397

看起来它为您提供了缓冲区的位置,而不是您通过next()获得的位置。

以前,我在使用readline()遍历文件时曾使用过seek /
tell技巧来倒退一行。使用next()时是否有一种方法可以快退一行?


问题答案:

否。我将创建一个适配器,该适配器在很大程度上转发所有呼叫,但在执行时保留最后一行的副本,next然后让您调用其他方法以使该行再次弹出。

实际上,我将适配器做成可以包装任何可迭代对象的适配器,而不是文件包装器,因为这听起来像在其他情况下经常有用。

亚历克斯建议使用itertools.tee适配器也可以,但是我认为编写自己的迭代器适配器来处理这种情况通常会更干净。

这是一个例子:

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


fiter = rewindable_iterator(file('file.txt', 'r'))
for line in fiter:
    result = process_line(line)
    if result is DoOver:
        fiter.backup()

扩展到允许您以不止一个值进行备份的方式并不难。



 类似资料:
  • 从这个问题跟进。如何修改此代码以允许多行倒卷?

  • 问题内容: 在Python中,对于二进制文件,我可以这样编写: 对于要逐行读取的文本文件,我可以编写以下代码: 简写为: PEP 234中 记录了该惯用语,但我无法为二进制文件找到类似的惯用语。 我已经试过了: 我尝试放置,但这是语法错误,因为在iter()中的callable之后有括号。 我知道我可以编写一个函数,但是默认习惯用法有没有办法在哪里使用缓冲区大小而不是面向行? 感谢您忍受Pytho

  • 问题内容: 无论如何,要使python列表迭代器向后移动? 基本上我有这个 运行以下代码将产生输出: 我知道为什么它会给我输出,但是有没有办法我可以在str()方法中向后退一步呢? 编辑 好吧,也许可以更清楚地说明这一点。我不想做一个完全相反的事情,基本上我想知道是否有一种简单的方法可以等效于python中的 双向 迭代器? 问题答案: 不,通常您不能使Python迭代器向后移动。但是,如果您只想

  • 问题内容: 我有两个文件,并且我想对两个文件进行逐行操作。(换句话说,每个文件的第一行都与之对应,第二行等等)。现在,我想到了一些稍微麻烦的方法来同时遍历两个文件。 但是 ,这是Python,因此我认为这里有一些语法速记。 换句话说,是否有一些简单的方法可以适应 这样就可以同时从两个文件中提取数据? 问题答案: Python 2: 使用加入了两个迭代器。 如果文件长度不相等,请使用。 在Pytho

  • 问题内容: 如何使用Swift 进行倒数计时? 问题答案: 问题1: 问题2: 两者都可以。SpriteKit是用于场景,运动等的SDK。简单视图应用程序是项目模板。他们不应该冲突

  • 问题内容: 我有一个DataFrame熊猫来的: 输出: 现在,我要遍历该框架的行。对于每一行,我希望能够通过列名访问其元素(单元格中的值)。例如: pandas有可能这样做吗? 我发现了类似的问题。但这并不能给我我所需的答案。例如,建议在那里使用: 要么 但是我不了解对象是什么以及如何使用它。 问题答案: DataFrame.iterrows是产生索引和行的生成器