当您使用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是产生索引和行的生成器