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
相关产品推荐
相关产品推荐

