Python:删除某些条件除外的行
Python: Delete lines from except certain criteria
我正在尝试使用特定条件从文件中删除行
我的脚本似乎可以工作,但我必须添加到许多 Or 语句中
有没有一种方法可以创建一个变量来保存我想从文件中删除的所有条件?
示例代码
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)
此致
您可以将每个列表项与每个条件进行比较,并仅获取满足条件的项目。然后简单地获取所有满足所有条件的行。
例如,这可以像 (EDITED CODE):
with open('AW.txt', 'r+') as f:
lines = f.readlines()
criterias = ["PPL","PPLX","PPLC"]
conditioned_lines = [[line for criteria in criterias if criteria not in line] for line in lines]
output = [criteria_lines[0] for criteria_lines in conditioned_lines if len(criteria_lines) == len(criterias)]
f.truncate(0)
f.seek(0)
f.write(''.join(output))
import re
output = []
with open('AW.txt', 'r+', encoding='utf-8') as f:
lines = f.readlines()
criteria = 'PPL'
output = re.sub("^.*[Crit1|Crit2|Crit3].*","")
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'
创建一个正则表达式对象,这意味着给定行中的 match at least one of these strings
可以被认为是使用尽可能多的 or
的替代品有标准的代码。
out_lines = [line for line in new_f if not obj.search(line)]
此语句的意思是,在给定行中搜索给定条件,如果至少找到其中一个条件,则保留该行。
希望这能消除您的疑虑。
我正在尝试使用特定条件从文件中删除行 我的脚本似乎可以工作,但我必须添加到许多 Or 语句中 有没有一种方法可以创建一个变量来保存我想从文件中删除的所有条件?
示例代码
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)
此致
您可以将每个列表项与每个条件进行比较,并仅获取满足条件的项目。然后简单地获取所有满足所有条件的行。
例如,这可以像 (EDITED CODE):
with open('AW.txt', 'r+') as f:
lines = f.readlines()
criterias = ["PPL","PPLX","PPLC"]
conditioned_lines = [[line for criteria in criterias if criteria not in line] for line in lines]
output = [criteria_lines[0] for criteria_lines in conditioned_lines if len(criteria_lines) == len(criterias)]
f.truncate(0)
f.seek(0)
f.write(''.join(output))
import re
output = []
with open('AW.txt', 'r+', encoding='utf-8') as f:
lines = f.readlines()
criteria = 'PPL'
output = re.sub("^.*[Crit1|Crit2|Crit3].*","")
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'
创建一个正则表达式对象,这意味着给定行中的 match at least one of these strings
可以被认为是使用尽可能多的 or
的替代品有标准的代码。
out_lines = [line for line in new_f if not obj.search(line)]
此语句的意思是,在给定行中搜索给定条件,如果至少找到其中一个条件,则保留该行。
希望这能消除您的疑虑。