Python中如何将对象列表存至文件并读取?新手求助
解决键鼠事件列表的序列化/反序列化问题
先解决Pickle的UnicodeDecodeError问题
这个错误大概率是因为读写文件时用了文本模式而非二进制模式——pickle是二进制序列化格式,必须用二进制IO操作:
正确的Pickle读写代码
# 保存事件列表 import pickle # 假设recorded_events是你录制的键鼠事件对象列表 with open("events.pkl", "wb") as f: pickle.dump(recorded_events, f)
# 读取事件列表 import pickle with open("events.pkl", "rb") as f: loaded_events = pickle.load(f)
如果修改模式后仍然报错,说明boppreh库的事件对象本身不支持pickle序列化(比如内部包含不可序列化的属性),这时可以使用下面的替代方案。
替代方案:用JSON存储(更通用、易读)
JSON是文本格式,无编码兼容问题,但需要先将键鼠事件对象转换成JSON支持的基础数据结构(比如字典)。
1. 录制时将事件转成字典并保存
import keyboard import mouse import json recorded_events = [] def handle_keyboard_event(event): event_data = { "type": "keyboard", "action": event.event_type, # 比如'up'/'down' "key": event.name, "timestamp": event.time } recorded_events.append(event_data) def handle_mouse_event(event): event_data = { "type": "mouse", "action": event.event_type, # 比如'move'/'down'/'up'/'click' "x": event.x, "y": event.y, "button": event.button if hasattr(event, "button") else None, "timestamp": event.time } recorded_events.append(event_data) # 启动录制监听 keyboard.hook(handle_keyboard_event) mouse.hook(handle_mouse_event) # 按ESC键停止录制 keyboard.wait("esc") # 保存到JSON文件 with open("automation_events.json", "w", encoding="utf-8") as f: json.dump(recorded_events, f, indent=2)
2. 读取JSON并重放事件
import keyboard import mouse import json import time # 读取事件数据 with open("automation_events.json", "r", encoding="utf-8") as f: events = json.load(f) # 处理时间延迟,还原原操作的时间间隔 if not events: print("没有可重放的事件") exit() base_time = events[0]["timestamp"] for event in events: time.sleep(event["timestamp"] - base_time) base_time = event["timestamp"] if event["type"] == "keyboard": if event["action"] == "down": keyboard.press(event["key"]) else: keyboard.release(event["key"]) elif event["type"] == "mouse": if event["action"] == "move": mouse.move(event["x"], event["y"], absolute=True, duration=0) elif event["action"] == "down": mouse.press(button=event["button"]) elif event["action"] == "up": mouse.release(button=event["button"]) elif event["action"] == "click": mouse.click(button=event["button"], pos=(event["x"], event["y"]))
额外说明
- JSON方案的优势:文件可手动编辑、跨语言兼容、无二进制编码问题
- 如果坚持用Pickle,可尝试指定协议版本(比如
pickle.dump(events, f, protocol=4)),适配不同Python版本 - 若不需要精确还原操作间隔,可去掉重放代码中的
time.sleep部分
内容的提问来源于stack exchange,提问作者MtLeftovers
相关产品推荐
相关产品推荐

