Python 在一个文件中循环,同时使用'file.readline();“好的”;练习?

Python 在一个文件中循环,同时使用'file.readline();“好的”;练习?,python,file,python-3.x,parsing,Python,File,Python 3.x,Parsing,我已经编写了一段代码,其中在遍历文件行的for循环中,我有一些file.readline()语句。这对我来说似乎是个很大的问题,尽管脚本似乎工作得很好。为了演示,假设文件中包含以下内容: ……等等 头球标志着重要的东西即将到来 重要资料第一行 重要资料第2行 重要资料第三行 ……等等 此标题和重要内容行块多次出现,因此我的脚本看起来像这样: with open(file, 'r') as fi: for line in fi: if header in line:

我已经编写了一段代码,其中在遍历文件行的
for
循环中,我有一些
file.readline()
语句。这对我来说似乎是个很大的问题,尽管脚本似乎工作得很好。为了演示,假设文件中包含以下内容:

……等等

头球标志着重要的东西即将到来

重要资料第一行

重要资料第2行

重要资料第三行

……等等

此标题和重要内容行块多次出现,因此我的脚本看起来像这样:

with open(file, 'r') as fi:
    for line in fi:
        if header in line:
            a = fi.readline()
            b = fi.readline()
            c = fi.readline()
            continue
fi中的行的
fi.readline()
都使用相同的对象(文件),因此在
继续之后,
行的下一个值将是4行,因为
readline()调用了3行

正如我所说的,上述方法是可行的,但我不是“如果可行,就不是愚蠢”运动的大力支持者

另一方面,另一种方法是:

found_header = True
with open(file, 'r') as fi:
    for line in fi:
        if header in line:
            new_stuff_inc = []
            found_header = True
        elif found_header:
            new_stuff_inc.append(line)
        if len(new_stuff_inc) == 3:
            found_header = False
这似乎更安全,因为文件一次只给一张嘴喂食(只有
行..
会消耗它),但它看起来非常复杂


那么,我们应该如何做这样的事情呢?

混合
for
readline()


这很有趣。在我的机器中,未引发任何
ValueError
。。顺便说一句,我使用的是Python3.5。因为Python3被标记了,所以我会将“it not work”(它不工作)的语气调低一点。它不再引发错误的事实表明,这可能是python开发人员想要朝的方向。是否可以调用
next(fi)
文件。在
for
循环中使用
next时,Python2中的一个圆滑的家伙使用了一个隐藏的缓冲区来提高性能。这在Python3中不会发生。如果您愿意,您可以将它们混合在一起,而不会产生我所知道的任何副作用(它们都作用于相同的底层文件迭代器)。这看起来很奇怪。@JimFasarakis Hilliard执行此操作时,循环中不能出现
StopIteration
异常吗?我同意您必须在for循环和while之间进行选择。@Jean-Françoisfare否否,它在EOF上返回一个空字符串。
Traceback (most recent call last):
  File "<module1>", line 3, in <module>
ValueError: Mixing iteration and read methods would lose data
with open(file, 'r') as fi:
    while True:
        line = fi.readline()
        if not line:   # end of file
            break
        if header in line:
            a = fi.readline()
            b = fi.readline()
            c = fi.readline()
            continue