2016-05-19 4 views
0

, wenn ich den folgenden CodePython pickle.load funktioniert nicht richtig auf Windows-Plattform

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) 

die Traceback-Show betrachten, die:

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 

Aber wenn ich die vorherigen Codes auf Mac laufen, es funktioniert gut .

Ein weiteres Problem ist, dass, wenn ich einige Attribute von PlayerData fallen lassen, kann es sowohl auf Windows und Mac arbeiten. Zum Beispiel

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) 

Ich habe keine Ahnung, wie man diese ersetzen 'r' mit 'rb' und 'w' mit 'wb'

Antwort