2017-01-19 6 views
0
def __init__(self): 
    self.name='' 
    self.id='' 
    self.sal=0.0 
    self.allowance=0.4*self.sal 
    self.ded = 0.1*self.sal 
    self.npay = self.sal+self.allowance-self.ded 
def Input(self): 
    self.name = raw_input('name') 
    self.id = raw_input('id') 
    self.sal = float(raw_input("salary")) 
def create(self): 
    f = open("pay.dat","wb") 
    pickle.dump(self,f) 
    f.close() 
def read_file(self): 
    f = open('pay.dat','rb') 
    x = pickle.load(f) 
    print"_"*45 
    print '{0:<15s}{1:15s}{2:15s}'.format("Employee_Id","Name","Basic salary") 
    print"_"*45 
    print '{0:<15s}{1:15s}{2:15f}'.format(x.id,x.name,x.sal) 
    f.close() 
def add(self): 
    self.Input() 
    self.create() 
    self.read_file() 

注 - Pickleは事前にインポートされ、クラスが作成されました。 クラスのオブジェクトを作成すると、すべての情報が正しい順序で表示されます。しかし、新しいデータを追加すると、前のデータも印刷されません。それ、どうやったら出来るの?ファイルの前のオブジェクトの情報を取得する方法

+0

このような例をmutilating避けてください。ここのような実際のクラス宣言なしでは、クラスodyでookに邪魔しています。 – jsbueno

答えて

0

あなたの作成方法:

def create(self): 
    f = open("pay.dat","wb") 
    pickle.dump(self,f) 
    f.close() 

が0バイトで、以前のファイルを切り捨て、それが呼び出された新しいオブジェクト毎回のための情報を書き込みます。ファイルを切り捨てずに情報を保持するには、"wb"の代わりに"ab"モードで開きます。

つまり、情報を読み取って表示するためのコードでは、ファイルから1つのオブジェクトだけが読み取られます。さらに多くのオブジェクトを読み込んでいたとしても、複数のオブジェクトの情報を出力するために読み込まれたオブジェクトをループすることさえできません。

ここで働く唯一のことは、実際には複数のオブジェクトを同じファイル上で連続してピクルすることができるということです。

したがって、 "read_file"メソッドを次のように書き直すことができます。しかし、複数のオブジェクトに対して繰り返し処理を実行しようとしなかったという事実は、このことをよりよく理解するためにはもっと学ばなければならないことを示唆しています例。いくつかの読書を得て、シーケンスとループ(forwhile)についてのPythonのインタラクティブなプロンプトを確認してください。ここでは基本を取得するには良い場所のようになります。 https://www.tutorialspoint.com/python/python_while_loop.htm

def read_file(self): 
    print"_"*45 
    print '{0:<15s}{1:15s}{2:15s}'.format("Employee_Id","Name","Basic salary") 
    print"_"*45 
    with (open('pay.dat','rb')) as f: 
     while True: 
      try: 
       x = pickle.load(f) 
      except EOFError: 
       # no more objects to read - exit loop 
       break 

      print '{0:<15s}{1:15s}{2:15f}'.format(x.id,x.name,x.sal) 
関連する問題