鱼C论坛

 找回密码
 立即注册
查看: 1313|回复: 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:
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[name]}')
            else:
                print('您输入的姓名不再通讯录中!')
        elif cid == 2:
            name = input('请输入联系人姓名: ')
            if name in c:
                print('您输入的姓名在通讯录中已存在 -->> ', end='')
                print(f'{name}: {c[name]}')
                if input(r'是否修改用户资料(Y/n):') in ['Y', 'y']:
                    c[name] = input('请输入用户联系电话:')
            else:
                c[name] = input('请输入用户联系电话:')
        elif cid == 3:
            name = input('请输入联系人姓名:')
            if name in c:
                del (c[name])
            else:
                print('您输入的联系人不存在。')
        elif cid == 4:
            break
        else:
            print('请输入正确的id。')
    print('|--- 感谢使用通讯录程序 ---|')
    save_file(c)


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[name]}')
            else:
                print('您输入的姓名不再通讯录中!')
        elif cid == 2:
            name = input('请输入联系人姓名: ')
            if name in c:
                print('您输入的姓名在通讯录中已存在 -->> ', end='')
                print(f'{name}: {c[name]}')
                if input(r'是否修改用户资料(Y/n):') in ['Y', 'y']:
                    c[name] = input('请输入用户联系电话:')
            else:
                c[name] = input('请输入用户联系电话:')
        elif cid == 3:
            name = input('请输入联系人姓名:')
            if name in c:
                del (c[name])
            else:
                print('您输入的联系人不存在。')
        elif cid == 4:
            break
        else:
            print('请输入正确的id。')
    print('|--- 感谢使用通讯录程序 ---|')
    save_file(c)


if __name__ == '__main__':
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 19:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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