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

2024-04-18 05:52:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

Tags: 文件inlogforosrootfilesopen
2条回答

这是你的问题:

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

每次您像这样打开日志文件,它会删除以前在其中的所有内容 从文件的开始写入。您可以将open更改为

^{pr2}$

('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来打开f会更好,如果这样的话,f.close()不会悬挂在嵌套循环的下面。)(进一步补充:enumerate(f.readlines())与{}相同,但速度较慢。)

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

也许你应该在循环外打开一次。在

相关问题 更多 >