Я не понимаю, почему я получаю только первое совпадение слова и 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()
Это ваша проблема:
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)
кроме более медленного.)
Вы переписываете свой выходной файл каждый раз, когда вы пишете на него, потому что вы открываете его с помощью 'w'
вместо 'a'
для добавления.
Возможно, вам нужно открыть его за пределами цикла.