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
当我运行下面的代码
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