发出调用模块以使用Python 3从文件中读取行

时间:2013-10-25 17:39:29

标签: python file readline

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

谢谢!

1 个答案:

答案 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 spam1 servings of spam,依此类推。

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

关于生成器on the wiki的更多信息,生成器上的David Beazley's presentations绝对值得一读。


*如果我猜对了,请自己提出这个想法。说真的,大多数人都没有意识到发电机是多么有用,直到暴露在众多例子中;你发现它们很有用,只是试图弄清楚它们被称为什么以及它们是如何用Python编写的。