鱼C论坛

 找回密码
 立即注册
查看: 1746|回复: 1

[已解决]求助通讯录小程序数据保存的问题

[复制链接]
发表于 2021-1-12 11:24:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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[name])
        else:
            print('您输入的姓名不再通讯录中!')

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

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

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

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

pickle.dump(contacts,f)
f.close()
print(contacts)   
这个通讯录程序 我想实现每次新添加的用户信息在退出后 还可以保存 下次进入程序后还有原有信息 可以从第一次运行程序 添加的用户信息保留了,但是第二次运行再添加的信息,第三次运行时就没有了,还是只有第一次运行添加进去的
三个print(contacts)   是自己测试数据添加是否成功的
最佳答案
2021-1-13 11:22:20
本帖最后由 suchocolate 于 2021-1-13 12:10 编辑

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


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

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


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


  9. with open('test2.pkl', 'rb') as f:
  10.     print('加载所有对象:')
  11.     while True:
  12.         try:
  13.             print(pickle.load(f))
  14.         except EOFError:
  15.             exit(0)
复制代码


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


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


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


  19. def save_file(f_c):
  20.     """
  21.     定义保存文件函数
  22.     :param f_c:
  23.     :return: none
  24.     """
  25.     with open('contact_db.pkl', 'wb') as f:
  26.         pickle.dump(f_c, f)


  27. def main():
  28.     """
  29.     定义主函数
  30.     :return: none
  31.     """
  32.     show_menu()
  33.     c = load_file()
  34.     while True:
  35.         cid = int(input('请输入相关的指令代码: '))
  36.         if cid == 1:
  37.             name = input('请输入联系人姓名: ')
  38.             if name in c:
  39.                 print(f'{name}: {c[name]}')
  40.             else:
  41.                 print('您输入的姓名不再通讯录中!')
  42.         elif cid == 2:
  43.             name = input('请输入联系人姓名: ')
  44.             if name in c:
  45.                 print('您输入的姓名在通讯录中已存在 -->> ', end='')
  46.                 print(f'{name}: {c[name]}')
  47.                 if input(r'是否修改用户资料(Y/n):') in ['Y', 'y']:
  48.                     c[name] = input('请输入用户联系电话:')
  49.             else:
  50.                 c[name] = input('请输入用户联系电话:')
  51.         elif cid == 3:
  52.             name = input('请输入联系人姓名:')
  53.             if name in c:
  54.                 del (c[name])
  55.             else:
  56.                 print('您输入的联系人不存在。')
  57.         elif cid == 4:
  58.             break
  59.         else:
  60.             print('请输入正确的id。')
  61.     print('|--- 感谢使用通讯录程序 ---|')
  62.     save_file(c)


  63. if __name__ == '__main__':
  64.     main()
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-13 11:22:20 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2021-1-13 12:10 编辑

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


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

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


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


  9. with open('test2.pkl', 'rb') as f:
  10.     print('加载所有对象:')
  11.     while True:
  12.         try:
  13.             print(pickle.load(f))
  14.         except EOFError:
  15.             exit(0)
复制代码


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


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


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


  19. def save_file(f_c):
  20.     """
  21.     定义保存文件函数
  22.     :param f_c:
  23.     :return: none
  24.     """
  25.     with open('contact_db.pkl', 'wb') as f:
  26.         pickle.dump(f_c, f)


  27. def main():
  28.     """
  29.     定义主函数
  30.     :return: none
  31.     """
  32.     show_menu()
  33.     c = load_file()
  34.     while True:
  35.         cid = int(input('请输入相关的指令代码: '))
  36.         if cid == 1:
  37.             name = input('请输入联系人姓名: ')
  38.             if name in c:
  39.                 print(f'{name}: {c[name]}')
  40.             else:
  41.                 print('您输入的姓名不再通讯录中!')
  42.         elif cid == 2:
  43.             name = input('请输入联系人姓名: ')
  44.             if name in c:
  45.                 print('您输入的姓名在通讯录中已存在 -->> ', end='')
  46.                 print(f'{name}: {c[name]}')
  47.                 if input(r'是否修改用户资料(Y/n):') in ['Y', 'y']:
  48.                     c[name] = input('请输入用户联系电话:')
  49.             else:
  50.                 c[name] = input('请输入用户联系电话:')
  51.         elif cid == 3:
  52.             name = input('请输入联系人姓名:')
  53.             if name in c:
  54.                 del (c[name])
  55.             else:
  56.                 print('您输入的联系人不存在。')
  57.         elif cid == 4:
  58.             break
  59.         else:
  60.             print('请输入正确的id。')
  61.     print('|--- 感谢使用通讯录程序 ---|')
  62.     save_file(c)


  63. if __name__ == '__main__':
  64.     main()
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-29 01:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表