为何avoids()函数仅获取words()函数返回的首个值?
问题分析与修复方案
嘿,我一眼就看到问题出在哪了!你的代码里,fin = open('word.txt')创建的文件对象是个单向迭代器——当你第一次在for line in fin里把所有行都遍历完之后,文件的读取指针就跑到文件末尾去了。后面再循环到第二个、第三个输入的单词时,再去遍历fin,因为指针已经在末尾了,根本读不到任何内容,自然就不会执行内部的检查逻辑了。
而且你原来的代码还有两个小问题:一是words()函数可以简化,不需要手动循环append;二是全局打开的文件没有正确关闭,最好用with语句来管理文件资源。
下面是修复后的完整代码:
def words(): # 直接返回输入分割后的列表,不用多此一举循环append return input().split() def avoids(): # 用with语句打开文件,自动处理关闭,同时把所有行读到内存里 with open('word.txt') as fin: all_lines = fin.readlines() # 只获取一次输入的单词列表,避免重复输入 target_words = words() for word in target_words: print(f"检查包含 '{word}' 的行:") for line in all_lines: stripped_line = line.strip() # 去掉换行符和首尾空格 if word in stripped_line: print(stripped_line) print("--- 分割线 ---") # 方便区分不同单词的结果 avoids()
关键修改点说明:
- 预加载文件内容:把
word.txt的所有行一次性读到all_lines列表里,这样每次检查不同单词时,都可以重复遍历这个列表,不会出现指针跑到末尾的问题。 - 简化
words()函数:input().split()本身就返回一个列表,直接返回它就行,不需要手动循环添加元素。 - 使用
with语句:自动管理文件的打开和关闭,避免资源泄漏,这是Python操作文件的最佳实践。 - 优化输出格式:添加了分割线和明确的提示文本,让输出结果更易读。
如果你不想一次性把文件读到内存里(比如文件特别大),也可以在每次检查新单词前,把文件指针移回开头,像这样修改avoids():
def avoids(): fin = open('word.txt') target_words = words() for word in target_words: print(f"检查包含 '{word}' 的行:") fin.seek(0) # 把文件指针移回文件开头 for line in fin: stripped_line = line.strip() if word in stripped_line: print(stripped_line) print("--- 分割线 ---") fin.close() # 记得手动关闭文件
不过这种方法不如预加载到内存高效,尤其是文件比较小的时候,优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者Ihor Kukharchuk
相关产品推荐
相关产品推荐

