2017-01-19 4 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

이 같은 예를 토막 피하십시오. 여기에있는 것처럼 실제 클래스 선언없이 클래스 ody에서 ook를 방해합니다. – jsbueno

답변

0

귀하의 작성 방법 :

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

0 바이트에서 이전 파일을 자릅니다 및 호출 될 새 개체마다의 정보를 기록. 파일을 자르지 않고 정보를 유지하려면 "wb" 대신 "ab" 모드로 엽니 다.

즉, 정보를 읽고 표시하는 코드는 파일에서 하나의 개체 만 읽습니다. 그리고 더 많은 객체를 읽었을지라도 둘 이상의 객체에 대한 정보를 인쇄하기 위해 읽힌 객체를 반복하려고 시도조차하지 않습니다.

여기서 유일하게 작동하는 것은 동일한 파일에서 여러 개체를 실제로 피클 링할 수 있다는 것과 그 파일을 순서대로 읽는 것입니다.

그래서 "read_file"메서드를 다음과 같이 다시 작성할 수 있습니다.하지만 하나 이상의 객체를 반복 할 루프를 만들지 않았다는 사실은이 사실을 더 잘 이해하기 위해 좀 더 배워야한다는 것을 암시합니다 예. 독서를하고 시퀀스와 루프 (forwhile)에 대한 대화식 프롬프트를 작성하십시오. 여기에 기본을 얻을 수있는 좋은 장소처럼 보인다 : 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)