Запись результатов поиска из цикла for в файл дает только одну строку (один результат) - PullRequest
1 голос
/ 03 мая 2011

Я не понимаю, почему я получаю только первое совпадение слова и ln в лог-файле, в который я пишу в цикле (есть 50 или более совпадений).И это не очень хорошо структурировано, как при печати на экране.Ниже приведен код.Спасибо!

Результаты в файле, который я пишу: 343438363939 70642

regex = re.compile(r'(?:3\d){6}')
for root,dirname, files in os.walk(directory):
    for file in files:
        if file.endswith(".log") or file.endswith(".txt"):
            f = open(os.path.join(root,file))
                for i, line in enumerate(f.readlines()):
                    searchedstr = regex.findall(line)
                    ln = str(i)
                    for word in searchedstr:
                         print "\nString found: " + word
                         print "Line: " + ln
                         print "File: " + os.path.join(root,file)
                         print " "
                         logfile = open('result3.log', 'w')
                         logfile.write(word + '\n' + ln)
                         logfile.close()
            f.close()

Ответы [ 2 ]

4 голосов
/ 03 мая 2011

Это ваша проблема:

                 logfile = open('result3.log', 'w')
                 logfile.write(word + '\n' + ln)
                 logfile.close()

Каждый раз, когда вы открываете файл журнала, подобный этому, он стирает все, что было в нем раньше, и начинает запись с начала файла,Вы можете либо изменить open на

                 logfile = open('result3.log', 'a')

(«a» означает «добавление»), либо - лучше - открыть logfile только один раз, вне самого внешнего цикла, например так:

regex = re.compile(r'(?:3\d){6}')
with open('result3.log', 'w') as logfile:
    for root, dirname, files in os.walk(directory):
        # ...
        logfile.write(word + '\n' + ln)

with позаботится о том, чтобы закрыть файл для вас, поэтому вам не нужен явный logfile.close().(Было бы лучше использовать with, чтобы также открыть f, хотя бы так, чтобы f.close() не болтался там ниже вложенных циклов.) (Дальнейшее добавление: enumerate(f.readlines()) совпадает с enumerate(f) кроме медленнее.)

2 голосов
/ 03 мая 2011

Вы перезаписываете свой выходной файл каждый раз, когда пишете в него, потому что вы открываете его с помощью 'w' вместо 'a' для добавления.

Может быть, вы должны открыть его один раз за пределами цикла.

...