将搜索结果从for循环写入文件只能给出一行(一个结果)

时间:2011-05-03 16:48:34

标签: python loops writing

我不明白为什么我只在一个日志文件中获得word和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 个答案:

答案 0 :(得分:4)

这是你的问题:

                 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()没有悬挂在嵌套循环下方。)(进一步补遗:{{ 1}}与enumerate(f.readlines())相同,但速度较慢。)

答案 1 :(得分:2)

您每次写入时都会覆盖输出文件,因为您使用'w'而不是'a'打开它以进行追加。

也许你应该在循环之外打开它。

相关问题