我想在我的主.py中有一个循环调用一个模块,它将打开一个文件并从文件返回一行,然后我想在主代码中的所述行上执行逻辑,然后询问模块下一行。此时我的代码一遍又一遍地返回相同的行,直到EOF,我不知道如何修复。
主要代码:
fwname = input('Please enter the file name (case sensitive): ')
readline = HexFileParser.ParseHex(fwname)
for line in readline:
#perform some logic
print (readline)
模块(HexFileParser):
def ParseHex(filelocation):
fwfile = open("C:\\Path\\"+filelocation,'r')
line = fwfile.readline()
endstring = ":00000001FF"
for line in fwfile:
if line.find(endstring) == -1:
return line.lstrip(':')
else:
break
谢谢!
答案 0 :(得分:0)
我认为你所要求的是generator function。*
如上所述,您的ParseHex
函数将return
第一行不包含endstring
。在那之后,它已经完成,并且不会做任何其他事情(除非你再次调用它)。
但是如果将return
更改为yield
,该函数将返回一个生成器。并且,当您遍历该生成器时,您将获得yield
的所有值,直到它完成。
用一个更简单的例子:
>>> def spam():
... for i in range(10):
... return '{} servings of spam'.format(i)
返回单个字符串"0 servings of spam"
。因为字符串碰巧是可迭代的(你得到了单个字符),所以下面的代码将在一行打印出0
,在下一行打印出一个空格,在下一行打印s
,依此类推。 / p>
>>> for i in spam():
... print(i)
但有一点变化:
>>> def spam():
... for i in range(10):
... yield '{} servings of spam'.format(i)
现在返回一个超过10个字符串的迭代器。因此,运行以下代码将打印0 servings of spam
,1 servings of spam
,依此类推。
>>> for i in spam():
... print(i)
关于生成器on the wiki的更多信息,生成器上的David Beazley's presentations绝对值得一读。
*如果我猜对了,请自己提出这个想法。说真的,大多数人都没有意识到发电机是多么有用,直到暴露在众多例子中;你发现它们很有用,只是试图弄清楚它们被称为什么以及它们是如何用Python编写的。