You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:45:37