Python键盘监听程序循环时History.txt文件未找到问题求助
问题分析与解决方案
错误根源
你的问题出在文件被删除后,下一次循环的on_release函数依然尝试打开已删除的文件。具体流程是:
- 第一次循环中,程序创建
History.txt并记录按键,当单词数达到5时,删除文件并终止当前listener。 - 进入第二次while循环后,新的listener启动,此时只要你释放任意按键,
on_release会直接执行open("History.txt", "r"),但这个文件已经被删掉了,所以抛出"File or directory not found"错误。
另外还有几个可以优化的点:
- 函数定义放在while循环内部,每次循环都会重新定义,没必要且容易出问题。
- 每次释放按键都打开文件统计单词数,效率很低,还会引发文件状态不一致的问题。
修正后的代码
from pynput.keyboard import Key, Listener import os # 全局变量,维护当前按键缓存和单词计数 count = 0 keys = [] word_count = 0 def on_press(key): global keys, count keys.append(key) count += 1 if count >= 1: count = 0 write_file(keys) keys = [] def write_file(keys): global word_count with open("History.txt", "a") as f: for key in keys: k = str(key).replace("'", "") if k.find("space") > 0: f.write('\n') word_count += 1 # 按空格视为一个单词结束,计数+1 elif k.find("Key") == -1: f.write(k) def on_release(key): global word_count # 先判断单词数是否达标,再处理文件删除 if word_count >= 5: # 删除前先检查文件是否存在,避免报错 if os.path.exists("History.txt"): os.remove("History.txt") # 重置计数器,为下一轮记录做准备 word_count = 0 return False # 终止当前listener,进入下一次循环 while True: # 每次循环启动新的监听进程 with Listener(on_press=on_press, on_release=on_release) as listener: listener.join()
关键改进点
- 函数移至循环外:避免每次循环重复定义函数,提升代码效率和可读性。
- 全局单词计数器:不再频繁打开文件统计,而是在写入时直接计数,既避免了文件操作风险,也提升了性能。
- 文件存在校验:删除文件前先判断是否存在,防止触发不必要的异常。
- 计数器重置:删除文件后同步重置单词计数,确保下一轮循环能从零开始统计。
额外说明
如果你的"单词"定义是按空格/换行分隔,上面的代码完全符合预期。如果需要更精确的单词判定(比如连续字母视为一个单词),可以调整write_file里的计数逻辑,比如通过判断输入是否为字母来累计单词。
内容的提问来源于stack exchange,提问作者bsafaria
相关产品推荐
相关产品推荐

