代码之家  ›  专栏  ›  技术社区  ›  hatmatrix

在迭代器中使用python“with”语句?

  •  4
  • hatmatrix  · 技术社区  · 14 年前

    我使用的是python 2.5。我想用这个“with”语句。

    from __future__ import with_statement
    a = []
    with open('exampletxt.txt','r') as f:
        while True:
            a.append(f.next().strip().split())
    print a
    

    “exampletxt.txt”的内容很简单:

    a
    b
    

    在这种情况下,我得到错误:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/tmp/python-7036sVf.py", line 5, in <module>
        a.append(f.next().strip().split())
    StopIteration
    

    如果我替换 f.next() 具有 f.read() ,它似乎陷入了一个无限循环。

    我想知道是否必须编写一个decorator类,它接受迭代器对象作为参数,并定义一个 __exit__ 方法呢?

    我知道将for循环用于迭代器更像是蟒蛇,但我想在由for循环调用的生成器中实现while循环…某物 like

    def g(f):
        while True:
            x = f.next()
            if test1(x):
                a = x
            elif test2(x):
                b = f.next()
                yield [a,x,b]
    
    a = []
    with open(filename) as f:
        for x in g(f):
            a.append(x)
    
    4 回复  |  直到 14 年前
        1
  •  4
  •   Ignacio Vazquez-Abrams    14 年前

    提升 StopIteration 是迭代器到达末尾时所做的。通常情况下 for 语句悄悄地捕获它并继续执行 else 子句,但是如果像在您的例子中那样手动迭代,那么代码必须准备好处理异常本身。

        2
  •  1
  •   Will    14 年前

    虽然while循环不会结束,但文件会结束,当没有其他要迭代的对象时,它会引发stopIteration异常。

        3
  •  1
  •   stefanB    14 年前

    您的while循环中没有任何终止条件,所以您将一直返回,直到您得到不处理的stopIteration异常为止。

        4
  •  1
  •   S.Lott    14 年前

    您可以使用显式的下一个循环来重写。当你有明确的 next 你只是在期待一个标志。

    通常,这种形式的循环可以重写。

    def g(f):
        while True:
            x = f.next()
            if test1(x):
                a = x
            elif test2(x):
                b = f.next()
                yield [a,x,b]
    

    你总是可以取代一个展望 下一个 通过缓冲值。

    def g(f):
        prev, a = None, None
        for x in f:
            if test2(prev)
                yield [ a, prev, x ]
            elif test1(x):
                a = x
            prev= x