我不明白为什么我只在一个日志文件中获得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()
答案 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'
打开它以进行追加。
也许你应该在循环之外打开它。