问题描述
这段代码做了它应该做的大部分事情。它记录我按下的键,但前提是我先删除 log.txt 文件,并且它不会像我期望的那样记录键周围的 ' 。任何帮助将其附加到文件而不是需要在启动时删除文件并从键周围剥离 ' 的任何帮助都会非常有帮助。
日志文件外观示例:
'T' 'h' 'i' 's'
'我''s'
'a'
't' 'e' 's' 't'
我希望它看起来像这样:
这个
是
测试
代码如下。感谢您的帮助。
import pynput
from pynput.keyboard import Key,Listener
count = 0
keys = []
def on_press(key):
global keys,count
keys.append(key)
count += 1
print("{0} pressed".format(key))
if count >= 10:
count = 0
write_file(keys)
keys = []
def write_file(keys):
with open("log.txt","a") as f:
for key in keys:
k = str(key).replace("''","")
if k.find("space") > 0:
f.write('\n')
elif k.find("Key") == -1:
f.write(k)
def on_release(key):
if key == Key.esc:
return False
with Listener(on_press=on_press,on_release=on_release) as listener:
listener.join()
解决方法
如pynput 文档中提到的,您可以使用key.char
来获取字符串,而不是将密钥转换为字符串并对其进行操作,而无需在其周围添加任何单引号。但要小心,因为如果键是特殊键,如空格、退格键、控制键等,它会抛出 AttributeError
。所以你必须把它放在 try/except 块中。
还有 k = str(key).replace("''","")
不起作用的原因是因为您试图将出现的两个单引号替换在一起,而在单引号彼此分开的键中情况并非如此,例如. 'h'
。
最终的工作代码是:
from pynput.keyboard import Key,Listener
count = 0
keys = []
def on_press(key):
global keys,count
keys.append(key)
count += 1
print("{0} pressed".format(key))
if count >= 10:
count = 0
write_file(keys)
keys = []
def write_file(keys):
with open("log.txt","a") as f:
for key in keys:
try:
k = key.char
f.write(k)
except AttributeError:
if key == Key.space:
f.write('\n')
def on_release(key):
if key == Key.esc:
return False
with Listener(on_press=on_press,on_release=on_release) as listener:
listener.join()
至于需要删除日志文件的问题,我不确定为什么会发生这种情况,因为它应该可以工作并且可以在我的计算机上工作。也许您有多个脚本在后台运行以访问同一个日志文件。您也可以尝试在不同的位置运行脚本,看看是否有效。