elif stament应该打印在我执行的搜索中找不到的日志文件和路径。但是,它们会产生在单个文件中搜索的每一行(过多的信息)。我做错了什么?
for line in fileinput.input(walk_dir(directory, (".log", ".txt"))):
result = regex.search(whitespace.sub('', line))
if result:
template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())
print output
temp.write(output)
break
elif not result:
template = "\nLine: {0}\nString not found in File: {1}\nString Type: {2}\n\n"
output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())
print output
temp.write(output)
else:
print "There are no files in the directory!!!"
实际代码:
elif searchType =='2':
print "\nDirectory to be searched: " + directory
print "\nFile result2.log will be created in: c:\Temp_log_files."
paths = "c:\\Temp_log_files\\result2.log"
temp = file(paths, "w")
userstring = raw_input("Enter a string name to search: ")
userStrHEX = userstring.encode('hex')
userStrASCII = ''.join(str(ord(char)) for char in userstring)
regex = re.compile(r"(%s|%s|%s)" % ( re.escape( userstring ), re.escape( userStrHEX ), re.escape( userStrASCII )))
goby = raw_input("Press Enter to begin search (search ignores whitespace)!\n")
def walk_dir(directory, extensions=""):
for path, dirs, files in os.walk(directory):
for name in files:
if name.endswith(extensions):
yield os.path.join(path, name)
whitespace = re.compile(r'\s+')
for line in fileinput.input(walk_dir(directory, (".log", ".txt"))):
result = regex.search(whitespace.sub('', line))
if result:
template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())
print output
temp.write(output)
#break
elif result not in line:
output = fileinput.filename()
print output
temp.write(output)
break
else:
print "There are no files in the directory!!!"
答案 0 :(得分:1)
你正在迭代传递给fileinput.input(...)
的每个文件的每行,对吗?并为每一行执行if
语句。如果条件为真,则为break
,但如果条件为假,则不会中断,而是写入temp
。因此,对于fileinput.input
中与条件不匹配的每一行,您都要在temp
处写一行并打印output
。 (实际上,上面的内容是错误的 - 请参阅下面的编辑。)
此外,elif str(result) not in line:
会产生奇怪的结果 - 只需使用其他人建议的else
即可。如果在这种情况下result
评估为false,则result == None
,即str(result) == 'None'
,这意味着如果一行包含None
,那么您将获得意外结果。
编辑:好的,实际上,严格来说,仔细查看您的实际代码,上述内容是错误的。但重点仍然是 - fileinput.input()
返回一个FileInput
对象,它实质上连接文件并依次迭代每一行。由于在某些情况下您不希望每行执行一个操作,但是每个文件都需要单独迭代它们。你可以在没有fileinput
的情况下做到这一点,但既然你正在使用它,我们将坚持下去:
for filename in walk_dir(directory, (".log", ".txt")):
for line in fileinput.input(filename):
result = regex.search(whitespace.sub('', line))
if result:
template = "\nLine: {0}\nFile: {1}\nString Type: {2}\n\n"
output = template.format(fileinput.filelineno(), fileinput.filename(), result.group())
print output
break # (assuming you only want to print the first result)
else:
ouput = fileinput.filename()
print output
temp.write(output)
break
其工作方式:对于列表中的每个文件,这将打印文件中的第一个匹配项,或者如果未找到匹配项则打印文件名。你可以在python中使用else
和for
循环;如果循环没有被破坏,则执行循环结束时的else
块。由于未找到匹配项,因此将打印文件名。
如果要在文件中打印所有匹配项,可以将匹配项保存在列表中,而不是使用else
,您可以测试列表。简化示例:
matches = []
for line in fileinput.input(filename):
if searchline(line):
matches.append(line)
if matches:
print template.format(matches)
else:
print fileinput.filename()