在 py 中将对象列表保存到文件并从文件中加载?我不知道从哪里开始

问题描述 投票:0回答:1

我开发了一个代码,用于编译由 boppreh 的键盘和鼠标 .hook 功能生成的对象列表,目的是生成和保存基本任务自动化文件。记录和重放操作很容易实现,尽管偶尔仍然存在错误,但保存包含对象列表的文件似乎根本不可能实现。腌制数据似乎是可能的,但我还没有找到足够简单的文档来解决引发的错误。

这是我的整个代码:

import keyboard, mouse, time, pickle, sys
from optparse import OptionParser
    
events = []

def OnKeyboardEvent(event):
    global events

    events.append(event)

def OnMouseEvent(event):
    global events

    # intended extra functionality here later
    events.append(event)

def record():
    global events

    print("Hooking now...")
    keyboard.hook(callback=OnKeyboardEvent)
    mouse.hook(callback=OnMouseEvent)
    print("Hooked.")
    keyboard.wait(hotkey='escape')
    keyboard.unhook_all()
    mouse.unhook_all()
    print("Exporting...")

    # File IO here

    print("Complete.\n")

def play(speed_factor):
    global events

    # File IO here

    print('Playing recorded events...')

    # Code below works fine, would love pointers if you have any tho
    last_time = None
    for event in events:
        if speed_factor > 0 and last_time is not None:
            time.sleep((event.time - last_time) / speed_factor)
        last_time = event.time

        if isinstance(event, mouse.ButtonEvent):
            if event.event_type == 'up':
                mouse.release(event.button)
            else:
                mouse.press(event.button)
        elif isinstance(event, mouse.MoveEvent):
            mouse.move(event.x, event.y)
        elif isinstance(event, mouse.WheelEvent):
            mouse.wheel(event.delta)
        else:
            key = event.scan_code
            if event.event_type == 'down':
                keyboard.press(key)
            else:
                keyboard.release(key)

    print('Complete.\n')

def main():
    record()
    play(2)

if __name__ == "__main__":
    main()

我尝试使用 pickle API,但遇到了一个错误,简单说明

line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)\[0\]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 65: character maps to \<undefined\>

我试过这个

    with open('bin.dat', 'wb') as f:
        pickle.dump(events, f)

    with open('bin.dat', 'r') as f:
        evening = pickle.load(f)

是否有一个我完全错过的文件io方法,或者我应该继续用pickle把头撞在墙上? 请对我宽容点,我是个新手:))提前谢谢你。

python list object file-io
1个回答
0
投票

使用pickle保存和加载对象时,请确保以二进制模式打开文件以进行读写:

with open('bin.dat', 'rb') as f:
events = pickle.load(f)

读取 pickle 文件时请确保使用“rb”模式而不是“r”,以避免解码错误。这应该可以修复您遇到的 UnicodeDecodeError。

来源:https://ioflood.com/blog/python-exception/

© www.soinside.com 2019 - 2024. All rights reserved.