lxx213 发表于 2021-1-12 11:24:00

求助通讯录小程序数据保存的问题

import pickle

print('|--- 欢迎进入通讯录程序 ---|')
print('|--- 1:查询联系人资料---|')
print('|--- 2:插入新的联系人---|')
print('|--- 3:删除已有联系人---|')
print('|--- 4:退出通讯录程序---|')

try:
   
    f = open('通讯录数据库.pki','rb')
      
except OSError:
   
    contacts = dict()

else:
    contacts = pickle.load(f)
   
    print(contacts)
    f.close()



print(contacts)   

while 1:


    instr = int(input('\n请输入相关的指令代码:'))


    if instr == 1:
      name = input('请输入联系人姓名:')
      if name in contacts:
            print(name + ' : ' + contacts)
      else:
            print('您输入的姓名不再通讯录中!')

    if instr == 2:
      name = input('请输入联系人姓名:')
      if name in contacts:
            print('您输入的姓名在通讯录中已存在 -->> ', end='')
            print(name + ' : ' + contacts)
            if input('是否修改用户资料(YES/NO):') == 'YES':
                contacts = input('请输入用户联系电话:')
      else:
            contacts = input('请输入用户联系电话:')

    if instr == 3:
      name = input('请输入联系人姓名:')
      if name in contacts:
            del(contacts)         # 也可以使用dict.pop()
      else:
            print('您输入的联系人不存在。')
            
    if instr == 4:
      break
   

print('|--- 感谢使用通讯录程序 ---|')

f =open('通讯录数据库.pki','ab')

pickle.dump(contacts,f)
f.close()
print(contacts)   
这个通讯录程序 我想实现每次新添加的用户信息在退出后 还可以保存 下次进入程序后还有原有信息 可以从第一次运行程序 添加的用户信息保留了,但是第二次运行再添加的信息,第三次运行时就没有了,还是只有第一次运行添加进去的
三个print(contacts)   是自己测试数据添加是否成功的

suchocolate 发表于 2021-1-13 11:22:20

本帖最后由 suchocolate 于 2021-1-13 12:10 编辑

pickle写入的是对象,执行一次load,只是加载1个对象,想加载所有需要再次使用load:import pickle


with open('test2.pkl', 'wb') as f:
    pickle.dump({1: 'a'}, f)

with open('test2.pkl', 'ab') as f:
    pickle.dump({2: 'b'}, f)
    pickle.dump({3: 'c'}, f)


with open('test2.pkl', 'rb') as f:
    print('只加载一个对象:', pickle.load(f))


with open('test2.pkl', 'rb') as f:
    print('加载所有对象:')
    while True:
      try:
            print(pickle.load(f))
      except EOFError:
            exit(0)

如果不想考虑追加问题,那么就在保存时wb重写,这样读取一次就够了。
import pickle
import os


def show_menu():
    print('|--- 欢迎进入通讯录程序 ---|')
    print('|--- 1:查询联系人资料---|')
    print('|--- 2:插入新的联系人---|')
    print('|--- 3:删除已有联系人---|')
    print('|--- 4:退出通讯录程序---|')


def load_file():
    """
    定义加载文件函数
    :return: 联系人字典
    """
    if not os.path.exists('contact_db.pkl'):
      save_file(dict())
    with open('contact_db.pkl', 'rb') as f:
      result = pickle.load(f)
      return result


def save_file(f_c):
    """
    定义保存文件函数
    :param f_c:
    :return: none
    """
    with open('contact_db.pkl', 'wb') as f:
      pickle.dump(f_c, f)


def main():
    """
    定义主函数
    :return: none
    """
    show_menu()
    c = load_file()
    while True:
      cid = int(input('请输入相关的指令代码: '))
      if cid == 1:
            name = input('请输入联系人姓名: ')
            if name in c:
                print(f'{name}: {c}')
            else:
                print('您输入的姓名不再通讯录中!')
      elif cid == 2:
            name = input('请输入联系人姓名: ')
            if name in c:
                print('您输入的姓名在通讯录中已存在 -->> ', end='')
                print(f'{name}: {c}')
                if input(r'是否修改用户资料(Y/n):') in ['Y', 'y']:
                  c = input('请输入用户联系电话:')
            else:
                c = input('请输入用户联系电话:')
      elif cid == 3:
            name = input('请输入联系人姓名:')
            if name in c:
                del (c)
            else:
                print('您输入的联系人不存在。')
      elif cid == 4:
            break
      else:
            print('请输入正确的id。')
    print('|--- 感谢使用通讯录程序 ---|')
    save_file(c)


if __name__ == '__main__':
    main()
页: [1]
查看完整版本: 求助通讯录小程序数据保存的问题