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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:04:05