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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 23:06:15