2013-10-25 1 views
0

Я хочу иметь петлю в моей основной .py, которая вызывает модуль, который откроет файл и вернет строку из файла, тогда я хочу выполнить логику на указанную строку в основном коде, затем спросите модуль для следующей строки. На этом этапе мой код возвращает одну и ту же строку снова и снова до тех пор, пока EOF и я не уверен, как исправить.Вызов вызывающего модуля для чтения строк из файла с использованием Python 3

Основной код:

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

В качестве побочного примечания 'if endstring not in line' является более простым (и, возможно, даже более быстрым, иногда) способом делать' if line.find (endstring) == -1'. Не используйте 'find', если вам не нужно знать позицию. – abarnert

+0

Hexparser должен открыть файл и вернуть каждую строку, чтобы я мог кодировать шестую строку в двоичный код в моем основном коде. Мне нравится, что это отдельный файл, который я могу назвать, потому что в конце концов у меня будет несколько разных файлов прошивки, которые я хочу проанализировать и отправить обратно в основной код для перевода в двоичный файл. Я изменю код, чтобы больше не использовать find, спасибо за этот совет. –

ответ

0

Я думаю, что вы просите это generator function. *

Как написано, ваша ParseHex функции return первую строку, которая не содержит endstring. После этого все будет сделано, и вы ничего не сделаете (если вы не назовете это снова).

Но если вы измените это значение return на yield, функция возвращает генератор. И, когда вы перебираете этот генератор, вы получите все значения: yield s, пока он не будет завершен.

С более простым примером:

>>> 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 spam, 1 servings of spam и так далее.

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

Там больше информации о генераторах on the wiki и David Beazley's presentations генераторы, безусловно, стоит читать.


* Если я правильно догадался, пригодился, когда придумал идею самостоятельно. Серьезно, большинство людей не понимают, насколько полезны генераторы, пока не будут представлены многочисленные примеры; вы выяснили, что они будут полезны и просто застрянут, пытаясь понять, что они называли и как они написаны на Python.

+0

Хорошо, что имеет смысл!Итак, что я могу сделать, найти общие строки в файле, -1, потому что я никогда не хочу отправлять в последнюю строку, а затем давать каждую строку. СПАСИБО! Я супер noob и был брошен в ситуацию, когда я кодирую свои способности, но этот сайт был настолько полезен. –

+0

Я не могу даже выгнать вас, потому что у меня слишком мало репутации, но спасибо. –

+0

@ThorPeterson: Я считаю, что вы можете [принять ответ] (http://stackoverflow.com/help/someone-answers), что более важно, чем продвижение в любом случае. (Это позволяет всем, кто ищет позже, знать, что это хороший вопрос, который имеет полезный ответ.) – abarnert