Запись результатов поиска из цикла for в файл дает только одну строку (один результат)

1

Я не понимаю, почему я получаю только первое совпадение слова и 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()
Теги:
loops
writing

2 ответа

4
Лучший ответ

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

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

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

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

('a' означает 'append'), или - лучше - откройте 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 для with, чтобы открыть f, но только там f.close() не свисает там ниже вложенных циклов.) (Дальнейшее добавление: enumerate(f.readlines()) совпадает с enumerate(f) кроме более медленного.)

  • 0
    Я внес изменения, которые вы упомянули, и это сработало, но не было читабельным. Итак, я попробовал: logfile.write ('\ nString:' + word + '\ nLine:' + ln + '\ n'). Это работает, но цикл чтения файлов, кажется, никогда не останавливается. И когда я пытаюсь удалить созданный файл, он говорит, что файл все еще открыт, хотя на самом деле это не так. есть идеи?
  • 0
    Мне нужно увидеть полную программу. Пожалуйста, начните новый вопрос для этого.
2

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню