删除我在 Python 3.x 中循环迭代的当前项目

问题描述

我目前在 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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...