2010-03-12 77 views
4

我正在使用Python 2.5。我试图用这个'with'语句。与迭代器使用python'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.read()取代f.next(),它似乎陷入了无限循环。

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

我知道这是更Python使用一个for循环的迭代器,但我想实现一个,用一个for循环...什么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) 
+2

与'with' ...无关吗? – stefanB 2010-03-12 04:29:51

+0

是的,显得如此。我认为'with'语句为异常处理提供了一种替代形式,但我想不是这样。 – hatmatrix 2010-03-12 04:36:57

+0

请更新标题。 – 2010-03-12 11:37:39

回答

4

提高StopIteration称为发电机内的while循环是迭代器在结束时所做的事情。通常,for语句以静默方式捕获它并继续到else子句,但如果它正在像您的情况那样手动迭代,那么代码必须准备好处理异常本身。

+0

谢谢。我想我认为'with'语句也应该处理这个异常,但不要猜测... – hatmatrix 2010-03-12 04:32:11

1

您的while循环没有结束,但是文件这样做会导致StopIteration异常,当没有其他东西要迭代时。

1

在任何while循环中都没有任何终止条件,因此您一直保持返回状态,直到出现StopIteration异常,您无法处理。

1

您可以随时重写while-with-explicit-next循环。当你有一个明确的next,你只是看一个令牌。

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

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

您可以随时通过缓冲值替换预读next

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 
+0

谢谢 - 看起来像for-loop是处理这些迭代器的方法。 – hatmatrix 2010-03-14 10:45:42