以下代码的工作正确无误:
def file_gen(f_name):
f = open(f_name)
for line in f:
yield line
gen_line = file_gen("foo.html")
gen_line.next() # '<!DOCTYPE>\n'
gen_line.next() # '<html> \n'
gen_line.next() # ... next line in file
但是这个函数引发了StopIteration
。我不明白为什么?
def file_gen(f_name):
f = open(f_name)
line = f.readline()
yield line
gen_line = file_gen('foo.html')
gen_line.next() # '<!DOCTYPE>\n'
gen_line.next() # StopIteration
答案 0 :(得分:5)
你有:
def file_gen(f_name):
f = open(f_name)
line = f.readline()
yield line
注意line = f.readline()
这只读取文件中的1行。
比较
def g(x):
li=range(x)
yield li.pop()
print list(g(10))
# [9]
用这个:
def g(x):
li=range(x)
while li:
yield li.pop()
print list(g(10))
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
yield
只能使用特定对象或表达式调用一次。一旦接收器使用它,它必须重新生成。所以你需要一个循环来读取文件的每一行。
您可以这样使用您的第二个(不太可读)表单:
def file_gen(f_name):
f = open(f_name)
while True:
line = f.readline()
if not line:
break
yield line
您需要一个循环来创建要产生的项目。在第一种情况下,for line in f: yield line
是一个循环。
我会用这种方式重写你的功能:
def file_gen(f_name):
with open(f_name) as f:
for line in f:
yield line
答案 1 :(得分:2)
你在第二个next()上得到StopIteration,因为你只得到了一个结果。你的意思是这样做吗?
def file_gen(f_name):
f = open(f_name)
lines = f.readlines()
for line in lines:
yield line
答案 2 :(得分:1)
不
line = f.readline()
只给你一条产线?因此迭代在此之后停止......
答案 3 :(得分:0)
强文本
def text_lines(path):
textFile = open(path, "r")
while True:
line = textFile.readline()
if line :
yield line.strip()
else:
break
textFile.close()