我正在尝试使用下面的函数来应用嵌套条件,该条件首先检查文件是否是文本文件,然后检查该文件中的单词。如果两者都为是,则将文件条目添加到组合框中。但是这个功能并没有给我任何东西。需要帮助。
def find():
i = 0
keyword = tb4.get("1.0", END).replace('\n', '')
if len(tb2.get("1.0", END)) > 2:
tid = tb2.get("1.0", END).replace('\n', '').replace("Destination Folder :", '')
arr = [x for x in os.listdir(tid) if x.endswith(".txt")]
while i < len(arr):
x = os.path.join(tid, arr)
with open(x) as f:
if 'keyword' in f.read():
combo2['values'] = arr
f.close()
else:
pass
else:
messagebox.showinfo(title="PROCEDURAL ERROR", message="FOLDER is not set. \nSet Destination")
提前致谢。
答案 0 :(得分:1)
我认为您的问题是,您希望keyword
检查文本文件的内容是否包含您的'keyword'
。但这是错误的,原因有两个。
首先,您要检查文字字符串keyword
,而不是变量x
中的字符串。
其次,您要检查文件名def file_has_keyword(filename, keyword):
with open(filename) as f:
contents = f.read()
return keyword in contents
中的字符串,而不是该文件的内容。
因此,您需要编写一个函数来检查文件中是否存在字符串:
keyword
...然后你可以在列表理解中调用该函数,确保传递变量'keyword'
而不是文字字符串arr = [x for x in os.listdir(tid) if x.endswith(".txt") and file_has_keyword(x, keyword)]
:
'keyword'
您编辑的版本只修复了这两个错误中的一个,并添加了大量新错误。
首先,您仍然在寻找keyword
而不是if 'keyword' in f.read():
:
arr
接下来,如果您想循环遍历for filename in arr:
中的所有值,只需执行while
;请勿尝试编写i = 0
循环设置while i < len(arr):
和arr[i]
并使用x = os.path.join(tid, arr)
。它要复杂得多,还有更多地方可以解决问题。
你确实得到了一些东西:
tid
您正尝试将字符串arr
加入整个字符串列表arr[i]
。这没有任何意义。你可能想在这里使用for
。但是,再次使用if 'keyword' in f.read():
combo2['values'] = arr
循环会更简单。
但同时,你的逻辑在这里没有任何意义:
combo2['values']
现在,如果您的任何文件都包含关键字,那么您就可以将combo2['values']
设置为整个文件列表,包括那些文件和那些文件以及#&# 39; t匹配。如果它们都不匹配,您只需单独留下combo2['values']
。
您要做的是将匹配文件收集到新列表中。然后,最后,分配with
新列表。
此外,使用f.close()
的全部意义在于它会自动关闭文件,因此请勿在{{1}}内调用with open(…) as f:
。
最后,您在else
声明中不需要if
;只添加一个pass
除了使代码更长,速度更慢之外什么也不做,让人类读者想知道你真正想做什么。
但是,实际上,解决所有这些问题的最简单方法是废弃这些新代码并重试。只需将列表解析扩展到一个循环中。拿这个:
arr = [x for x in os.listdir(tid) if (x.endswith(".txt") and file_has_keyword(x, keyword)]
...并将每个子句转换为嵌套语句,底部带有append
,如下所示:
arr = []
for x in os.listdir(tid):
if x.endswith(".txt") and file_has_keyword(x, keyword):
arr.append(x)
combo2['values'] = arr
现在,如果出现问题,应该很容易解决它。例如,看起来您需要文件名os.path.join
,对吧?所以:
arr = []
for x in os.listdir(tid):
pathname = os.path.join(tid, x)
if x.endswith(".txt") and file_has_keyword(pathname, keyword):
arr.append(x)
combo2['values'] = arr
将变量重命名为有意义的东西也可能有所帮助。我不知道tid
应该是什么,或x
。 arr
显然是某种数组(实际上是一个列表),但是什么?哪个组合是combo2
?像这样的东西会更容易调试:
filenamess = []
for filename in os.listdir(destdir):
pathname = os.path.join(destdir, filename)
if filename.endswith(".txt") and file_has_keyword(pathname, keyword):
filenames.append(filename)
files_combo['values'] = filenames