无法使用 pynput 将用户输入正确存储在文件中
Can't get user input to store in file correctly with pynput
这段代码完成了它应该做的大部分工作。它记录我按下的键,但前提是我先删除 log.txt 文件,并且它不会像我期望的那样记录键周围的 ' 。任何帮助让它附加到文件而不是需要在开始时删除文件并从键周围剥离 ' 的任何帮助都会非常有帮助。
日志文件的外观示例:
'T' 'h' 'i' 's'
'i' '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
获取不带任何单引号的字符串,而不是将密钥转换为字符串并对其进行操作。但要小心,因为如果键是特殊键,如 space、返回 space、控制键等,它会抛出 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()
至于需要删除日志文件的问题,我不确定为什么会这样,因为它应该可以工作,而且它在我的电脑上工作。也许您在后台有多个脚本 运行 访问同一个日志文件。您也可以在其他位置尝试 运行 脚本,看看是否可行。
这段代码完成了它应该做的大部分工作。它记录我按下的键,但前提是我先删除 log.txt 文件,并且它不会像我期望的那样记录键周围的 ' 。任何帮助让它附加到文件而不是需要在开始时删除文件并从键周围剥离 ' 的任何帮助都会非常有帮助。
日志文件的外观示例:
'T' 'h' 'i' 's'
'i' '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
获取不带任何单引号的字符串,而不是将密钥转换为字符串并对其进行操作。但要小心,因为如果键是特殊键,如 space、返回 space、控制键等,它会抛出 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()
至于需要删除日志文件的问题,我不确定为什么会这样,因为它应该可以工作,而且它在我的电脑上工作。也许您在后台有多个脚本 运行 访问同一个日志文件。您也可以在其他位置尝试 运行 脚本,看看是否可行。