代码之家  ›  专栏  ›  技术社区  ›  MtLeftovers

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

  •  0
  • MtLeftovers  · 技术社区  · 2 年前

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

    以下是我的全部代码:

    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方法,或者我应该继续用泡菜把我的头撞在墙上? 对我宽容一点,我有点新手:))提前谢谢你。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Gabriel Ramuglia    2 年前

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

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

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

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

    推荐文章