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

Python如何实现仅当链接不存在时才将其写入txt文本文件

问题根源

  • 你使用a+模式打开文件时,文件指针默认定位在文件末尾,直接调用file.read()会从末尾开始读取,必然读不到任何已有内容,所以判断逻辑永远不生效,每次都会写入新链接。
  • 直接判断site in file.read()存在误判风险:如果已有链接包含当前传入的site作为子串,会被误判为已存在。
  • 没有用上下文管理器管理文件操作,出现异常时可能导致文件句柄泄漏。

修复后的可运行代码

def writeSite(site):
    # 读取所有已有链接存入集合,去重同时避免子串误判
    existing_sites = set()
    try:
        with open("websites.txt", "r", encoding="utf-8") as f:
            for line in f:
                # 去掉每行的换行符和首尾空白字符
                existing_sites.add(line.strip())
    except FileNotFoundError:
        # 首次运行文件不存在时用空集合即可
        pass
    
    # 链接不存在才执行写入
    if site not in existing_sites:
        with open("websites.txt", "a", encoding="utf-8") as f:
            f.write(f"{site}\n")

优化说明

  • 拆分读、写两个操作,读文件用r模式,指针默认在开头,能正确读取全部已有内容。
  • 用集合存储已有链接,查询时间复杂度为O(1),判断效率远高于每次读全文字符串匹配,同时完全避免子串误判问题。
  • 用with上下文管理器自动处理文件关闭,无需手动调用close(),异常场景也不会泄漏文件句柄。
  • 增加文件不存在的异常捕获,首次运行没有websites.txt时也能正常创建文件写入。
  • 显式指定encoding=utf-8避免不同系统默认编码不一致导致的乱码问题。
  • 可选优化:如果爬虫写入频率很高,可以把existing_sites放到全局内存缓存,每次写入前查缓存,避免每次调用都读一次文件,性能更好。

内容的提问来源于stack exchange,提问作者user15070324

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:06:03