问题描述
我目前在 Python 3.x 中有以下代码:-
lst_exclusion_terms = ['bob','jenny','michael']
file_list = ['1.txt','2.txt','3.txt']
for f in file_list:
with open(f,"r",encoding="utf-8") as file:
content = file.read()
if any(entry in content for entry in lst_exclusion_terms):
print(content)
我的目的是查看列表file_list中每个文件的内容。在查看内容时,我想检查列表 lst_exclusion_terms 中是否存在任何条目。如果是,我想从列表中删除该条目。
因此,如果 'bob' 在 2.txt 的内容中,它将从列表中删除(弹出)。
我不确定如何用命令替换我的 print(content)
以识别正在检查的项目的当前索引号,然后将其删除。
有什么建议吗?谢谢
解决方法
您想根据文件是否包含一些文本来filter
列出文件。
Python 内置函数 filter
可以做到这一点。 filter
接受一个函数,该函数返回一个布尔值和一个可迭代对象(例如一个列表),并返回一个迭代器,该迭代器对函数返回 True
的原始可迭代对象的元素进行迭代。
所以首先你可以写那个函数:
def contains_terms(filepath,terms):
with open(filepath) as f:
content = f.read()
return any(term in content for term in terms)
然后在filter
中使用它,并从结果中构造一个list
:
file_list = list(filter(lambda f: not contains_terms(f,lst_exclusion_terms),file_list))
当然,lambda
是必需的,因为 contains_terms
接受 2 个参数,如果术语在文件中,则返回 True
,这与您想要的相反(但从函数本身的角度来看更有意义)。您可以将函数专门用于您的用例,并消除对 lambda
的需要。
def is_included(filepath):
with open(filepath) as f:
content = f.read()
return all(term not in content for term in lst_exclusion_terms)
定义此函数后,对 filter
的调用更加简洁:
file_list = list(filter(is_included,file_list))
,
我以前有过这样的愿望,我需要在迭代时删除一个列表项。通常建议您按照建议重新创建一个包含您想要的内容的新列表here
然而,这里有一种快速而肮脏的方法可以从列表中删除文件:
lst_exclusion_terms = ['bob','jenny','michael']
file_list = ['1.txt','2.txt','3.txt']
print("Before removing item:")
print(file_list)
flag = True
while flag:
for i,f in enumerate(file_list):
with open(f,"r",encoding="utf-8") as file:
content = file.read()
if any(entry in content for entry in lst_exclusion_terms):
file_list.pop(i)
flag = False
break
print("After removing item")
print(file_list)
在这种情况下,文件 3.txt
已从列表中删除,因为它与 lst_exclusion_terms
匹配
以下是每个文件中使用的内容:
#1.txt
abcd
#2.txt
5/12/2021
#3.txt
bob
jenny
michael