如何用seek()删除含关键词的行?为何seek()改写会跳过输入行?
问题分析与修正代码
代码中的问题点
- 重复读取
input.txt生成a和b,属于冗余IO操作,完全可以一次读取后复用。 - 外层的
for i in list(temp):循环完全多余,会导致output.txt被重复写入多次,最终内容出现重复。 - 打开
output.txt做过滤时,打开方式语法错误('r+'写成'r'+),且用seek(0)后直接写入会残留旧文件的多余内容(若原文件长度大于过滤后内容长度)。 - 黑名单匹配的循环赋值逻辑可以简化,用列表推导式更高效清晰。
修正后的代码
from itertools import product # 读取黑名单文件 with open('banLeftSide.txt') as f: ban_left = f.read().splitlines() with open('banRightSide.txt') as f: ban_right = f.read().splitlines() # 读取输入文件,生成基础候选列表 with open('input.txt') as f: lines = f.read().splitlines() # 过滤左侧黑名单内容 left_candidates = [line for line in lines if line not in ban_left] # 过滤右侧黑名单内容 right_candidates = [line for line in lines if line not in ban_right] # 生成有效组合并写入结果文件 with open('output.txt', 'w') as f: for left, right in product(left_candidates, right_candidates): if left != right: f.write(f"{left} - {right}\n")
可选的标记过滤版代码
如果必须保留“标记黑名单内容再过滤”的逻辑,可使用以下代码:
from itertools import product with open('banLeftSide.txt') as f: ban_left = f.read().splitlines() with open('banRightSide.txt') as f: ban_right = f.read().splitlines() with open('input.txt') as f: lines = f.read().splitlines() # 将黑名单内容标记为keyword left_candidates = ['keyword' if line in ban_left else line for line in lines] right_candidates = ['keyword' if line in ban_right else line for line in lines] # 生成组合并过滤含keyword的行 with open('output.txt', 'w') as f: for left, right in product(left_candidates, right_candidates): if left != right and 'keyword' not in left and 'keyword' not in right: f.write(f"{left} - {right}\n")
内容的提问来源于stack exchange,提问作者wadwewe
相关产品推荐
相关产品推荐

