python pickle.load 在 windows 平台上工作不正常

python pickle.load works incorrectly on windows platform

当我运行下面的代码

import pickle


class PlayerData:
    def __init__(self, user_name, pwd):
        self.name = user_name
        self.pwd = pwd
        self.pos = 12
        self.online = False
        self.info = {'gunNum': 0,
                     'guns': None,
                     'barrelNum': 0,
                     'barrels': None,
                     'health': 100,
                     'ammos': {'0': {'ammoCurrentCarried': 50,
                                     'ammoName': 'Assault Rifle'},
                                '1': {'ammoCurrentCarried': 30, 'ammoName': 'Assault Rifle RUS'},
                                'number': 2
                               }
                     }


def create_user_file(user):
    file_path = "data/users/" + user.name
    f = open(file_path, "w")
    pickle.dump(user, f, pickle.HIGHEST_PROTOCOL)
    f.close()


def load_user(user_name):
    file_path = "data/users/" + user_name
    f = open(file_path, "r")
    user = pickle.load(f)
    f.close()
    return user


def register(user_name):
        pwd = "ab"
        data = PlayerData(user_name, pwd)
        create_user_file(data)


def login(user_name):
    user = load_user(user_name)
    print user.__dict__

name = "dd"
register(name)
login(name)

回溯表明:

Traceback (most recent call last):
  File "D:/pycharm/hello/hello.py", line 50, in <module>
    login(name)
  File "D:/pycharm/hello/hello.py", line 45, in login
    user = load_user(user_name)
  File "D:/pycharm/hello/hello.py", line 33, in load_user
    user = pickle.load(f)
  File "C:\Python27\lib\pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "C:\Python27\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "C:\Python27\lib\pickle.py", line 1169, in load_binput
    i = ord(self.read(1))
TypeError: ord() expected a character, but string of length 0 found

但是如果我 运行 之前在 Mac 上的代码,它工作正常。

另一个问题是,如果我删除 PlayerData 的一些属性,它可以在 windows 和 mac 上工作。例如,

import pickle


class PlayerData:
    def __init__(self, user_name, pwd):
        self.name = user_name
        self.pwd = pwd
        #self.pos = 12 #comment this line
        self.online = False
        self.info = {'gunNum': 0,
                     'guns': None,
                     'barrelNum': 0,
                     'barrels': None,
                     'health': 100,
                     'ammos': {'0': {'ammoCurrentCarried': 50,
                                     'ammoName': 'Assault Rifle'},
                                '1': {'ammoCurrentCarried': 30, 'ammoName': 'Assault Rifle RUS'},
                                'number': 2
                               }
                     }


def create_user_file(user):
    file_path = "data/users/" + user.name
    f = open(file_path, "w")
    pickle.dump(user, f, pickle.HIGHEST_PROTOCOL)
    f.close()


def load_user(user_name):
    file_path = "data/users/" + user_name
    f = open(file_path, "r")
    user = pickle.load(f)
    f.close()
    return user


def register(user_name):
        pwd = "ab"
        data = PlayerData(user_name, pwd)
        create_user_file(data)


def login(user_name):
    user = load_user(user_name)
    print user.__dict__

name = "dd"
register(name)
login(name)

我不知道如何解决这个问题

尝试用 'rb' 替换 'r',用 'wb' 替换 'w'。请参阅这个古老的 Python 错误报告:https://mail.python.org/pipermail/python-bugs-list/2005-April/028565.html