0

我正在使用 python pickle 来维护联系人列表。我有两个问题:

  1. 添加新人后,我看不到打印所有人员的整个列表。只打印新人。代码有什么问题?
  2. 如果我要删除一个联系人,如何更改本地文件?

编码:

import pickle

class contact:
    person= {};    
    def add(self, name,contact):
        self.person[name] = contact;
        store2file(self.person);
        #print(self.contactlist);        
    def delete(self,name):
        del self.person[name];
        #print(self.person);  
    def modify(self,name,contact):
        self.person[name] = contact;
        store2file(self.person);  

def store2file(person):
    mycontactfile = 'contactlist.data';
    f = open(mycontactfile,'wb');
    pickle.dump(person,f);
    f.close();

    f = open(mycontactfile,'rb');
    storedcontact = pickle.load(f);
    print (storedcontact);

def main():
    mycontact = contact();
    option = input('Pls select option: 1 Add; 2 delete; 3 update: ');
    if option == '1':
        name = input('Enter the name: ');
        contactNo = input('Enter the contact number: ');
        mycontact.add(name,contactNo);
        store2file(mycontact);

    elif option =='2':
        name = input('Enter the name: ');
        mycontact.delete(name);
    elif option =='3':
        name = input('Enter the name: ');
        contactNo = input('Enter the contact number: ');
        mycontact.modify(name,contactNo);
    else:
        print('Pls select proper option');

main()
4

2 回答 2

1

您只将新人写入文件,覆盖现有数据。您可以将列表写入文件(始终读取列表并在写入之前附加新值)以获得您似乎想要的行为。

工作流程应该是这样的:

  • 从文件中读取当前列表
  • 改变东西(添加联系人,删除联系人)
  • 也许改变更多的东西......
  • 将列表写回文件

没有列表也可以(但更复杂):

  • 按照“Guy”的建议,使用'a'而不是'w'和/或pickle.dump()多次使用相同的文件处理程序附加到文件
  • pickle.load()在这样的文件上多次,直到EOFError发生

要从此类文件中删除条目,您必须加载每个条目并将您仍然想要的所有条目保存回文件(如filter())。

于 2013-11-13T05:37:58.227 回答
0

来自 python 文档http://docs.python.org/2/tutorial/inputoutput.html

'w' 仅用于写入(现有的同名文件将被删除),'a' 打开文件以进行追加;

要删除联系人,请细化其行并将其从文件中删除,请参阅删除文件中的特定行 (python)

于 2013-11-13T05:37:57.690 回答