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 :(得分:0)
您的创建方法:
def create(self):
f = open("pay.dat","wb")
pickle.dump(self,f)
f.close()
以0字节截断前一个文件,并在每次调用时写入新对象的信息。要在不截断文件的情况下保留文件信息,请以"ab"
模式而不是"wb"
打开文件。
也就是说,用于读取和显示信息的代码只能读取文件中的单个对象。即使它正在读取更多对象,它甚至不会尝试循环读取对象以在多个对象上打印信息。
这里唯一有用的是你可以在同一个文件中按顺序腌制几个对象 - 然后按顺序读取它们。
所以,你可以重写你的“read_file”方法,如下所示 - 但事实上你甚至没有尝试循环迭代多个对象,这表明你必须学习更多以便更好地理解这个例子。请确保您获得一些关于序列和循环(for
和while
)的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)