1

我不明白为什么我只在一个循环中写入的日志文件中获得 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()
4

2 回答 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(使用 a打开会更好f,只要在嵌套循环下面没有f.close()悬空。)enumerate(f.readlines())enumerate(f)

于 2011-05-03T16:57:30.403 回答
2

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

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

于 2011-05-03T16:57:27.860 回答