Python:从中删除行,但某些条件除外

Python:从中删除行,但某些条件除外,python,criteria,keyword,Python,Criteria,Keyword,我正在尝试使用特定条件从文件中删除行 我的脚本似乎很有效,但我必须添加到许多或语句中 有没有一种方法可以创建一个变量来保存我想从文件中删除的所有标准 示例代码 with open("AW.txt", "r+", encoding='utf-8') as f: new_f = f.readlines() f.seek(0) for line in new_f: if "PPL"not in line.split() or "PPLX"not in line.

我正在尝试使用特定条件从文件中删除行 我的脚本似乎很有效,但我必须添加到许多或语句中 有没有一种方法可以创建一个变量来保存我想从文件中删除的所有标准

示例代码

with open("AW.txt", "r+", encoding='utf-8') as f:
    new_f = f.readlines()
    f.seek(0)
    for line in new_f:
        if "PPL"not in line.split() or "PPLX"not in line.split() or "PPLC"not in line.split():
            f.write(line)
    f.truncate()
我更多的是这样思考,但当我添加多个标准时,它失败了

output = []
with open('AW.txt', 'r+', encoding='utf-8') as f:
    lines = f.readlines()
    criteria = 'PPL'
    output =[line for line in lines if criteria not in line]

f.writelines(output)

关于

您可以将每个列表项与每个标准进行比较,并仅获取符合标准的项目。然后简单地得到满足所有标准的所有行

例如,这可以像(编辑的代码)那样完成:

这将删除这些行。但它不会在writelines声明中打印出来 你的问题有点模糊,要求删掉几行,然后试着把它们写出来
添加尽可能多的条件,如下图所示

您可以使用正则表达式来解决问题,这将减少代码中语句和检查的数量。如果您有一个可以是动态的条件列表,让我们调用条件列表
crit_list
,那么代码如下所示-

import re 
with open("AW.txt", "r+", encoding='utf-8') as f:
    new_f = f.readlines()
    crit_list = ['PPL', 'PPLC', 'PPLX']    # Can use any number of criterions 
    obj = re.compile(r'%s' % ('|'.join(crit_list)))
    out_lines = [line for line in new_f if not obj.search(line)]
    f.truncate(0)
    f.seek(0)
    f.writelines(out_lines)
使用
regex
使它看起来与OP发布的方式不同。让我解释一下包含正则表达式的两行代码-

obj = re.compile(r'%s' % ('|'.join(crit_list)))
此行使用正则表达式
'PPL | PPLX | PPLC'
创建一个正则表达式对象,这意味着
在给定行中至少匹配这些字符串中的一个
,可以将其视为在代码中使用尽可能多的
的替代

out_lines = [line for line in new_f if not obj.search(line)]
此语句表示在给定行中搜索给定条件,如果至少找到其中一个,则保留该行


希望这能消除你的疑虑

我在您的代码值上遇到此错误错误错误:关闭文件上的i/O操作。对其他人来说,很抱歉模糊lol我的意思是,我有一个文本文件,其中有很多行。给定的标准是需要从文件中删除的标准。所有不符合此标准的其他文件都需要保留在文件中,如果文件已打开,它会将输出内容附加到文件中,而不是用输出列表内容替换文件内容。我修改了我的答案,删除了包含条件词的文件中的行。谢谢,错误是因为f.writelines(输出)是现成的(只是一个制表符,错误消失了。脚本似乎不会删除行,也不会添加行。这是因为行是制表符分隔的?可以在此处应用Line.split,对吗?请立即尝试代码,我已经编辑了它。它将替换“AW.txt”的内容使用更新的行。您不必显式关闭文件,
with
context manager会处理该问题。可以使用grep或sed,并且可以在一行中完成?
grep-v“PPL[X|C]*”file.txt
works?sed替代方法是
sed-E-i-E”/PPL(X|C)?/d“AW.txt
感谢您的帮助,它的编写方式略有不同,但它能做需要做的事情do@Unwanted如果您不熟悉正则表达式,请解释两行不明显的代码,以供您理解。感谢您和@Dex在这方面的帮助,并愿意向我学习一些Python:-)
obj = re.compile(r'%s' % ('|'.join(crit_list)))
out_lines = [line for line in new_f if not obj.search(line)]