0

我想在我的主 .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

谢谢!

4

1 回答 1

0

我认为您要的是生成器功能。*

如所写,您的ParseHex函数将return是第一行不包含endstring. 之后,它就完成了,不会做任何其他事情(除非你再次调用它)。

但是,如果将其更改return为 a yield,该函数将返回一个生成器。而且,当您遍历该生成器时,您将获得它yield的所有值,直到它完成。

用一个更简单的例子:

>>> def spam():
...     for i in range(10):
...         return '{} servings of spam'.format(i)

这将返回一个字符串,"0 servings of spam". 因为字符串碰巧是可迭代的(你得到了单个字符),所以下面的代码将在一行上打印出来0,在下一行打印一个空格,在下一行打印s一个,依此类推。

>>> for i in spam():
...     print(i)

但有一点变化:

>>> def spam():
...     for i in range(10):
...         yield '{} servings of spam'.format(i)

现在这将返回一个超过 10 个字符串的迭代器。因此,运行以下代码将打印0 servings of spam1 servings of spam等。

>>> for i in spam():
...     print(i)

wiki上有更多关于生成器的信息,David Beazley关于生成器的介绍绝对值得一读。


* 如果我猜对了,我很高兴自己提出这个想法。说真的,大多数人在接触大量示例之前都没有意识到生成器的有用性。你发现它们很有用,只是试图弄清楚它们被称为什么以及它们是如何用 Python 编写的。

于 2013-10-25T17:48:22.897 回答