鱼C论坛

 找回密码
 立即注册
查看: 1790|回复: 2

python中pickle存取文件的问题求助

[复制链接]
发表于 2020-11-18 16:18:46 | 显示全部楼层 |阅读模式

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

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

x
在使用pickle.load()时遇到了难题,我用pickle.dump()将一个数据存进了文件,但是读取不出来了,而文件里打开显示是已经存上了数据的。
代码如下,其中指令2能写入,但是指令2写入的数据这个函数读取不了,指令1,4正常。有没有大佬告诉我是什么原因导致的啊?

import pickle

def fun1():
    print('''
    1:查询联系人资料
    2:插入新的联系人
    3:删除已有联系人
    4:退出通讯录
    ''')

    pickle_file =open(r'D:\python\测试资源\联系人.txt','rb+')

    t = pickle_file.readlines()
    dict_name = pickle.loads(t[0])

    dict_name_1=str(dict_name)
    print(dict_name_1)
   
    zhiling_daima =int(input('请输入相关的指令代码:'))
    while True:
        if zhiling_daima ==1:
            temp_name = str(input('指令1:请输入名字:'))

            if dict_name_1.find(temp_name):
                print(dict_name[temp_name])
                pickle_file.close()
            else:
                print('没有找到')
            return fun1()
      
        elif zhiling_daima ==2:
            temp_name = input('指令2:请输入名字:')
            temp_phonenumber = input('指令2:请输入电话号码:')

            dict_name[temp_name] = temp_phonenumber
            pickle.dump(dict_name,pickle_file)

            pickle_file.close()

            print(dict_name)
            print('联系人已写入')
            return fun1()

        elif zhiling_daima ==3:
            temp_name = input('指令3:请输入名字:')
            temp_yes =input('你确定要删除该联系人吗?(是/否)')
            if temp_yes =='是':
                del dict_name[temp_name]
                pickle.dump(dict_name,pickle_file)
                pickle_file.close()
                print('删除成功')
                return fun1()
        elif zhiling_daima ==4:
            temp_yes =input('指令4:你确定要退出吗?(是/否)')
            if temp_yes =='是':
                print('感谢使用')
                pickle_file.close()
                break
        else:
            print('代码有误')
            pickle_file.close()
            return fun1()


fun1()

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-18 16:59:14 | 显示全部楼层
这里说下注意事项,自己检查下代码吧,实在是太长了懒得看
pickle每次读写都要注意,先open(),再读取(或写入),再close()
你这个一大串的close,看你代码还得追逻辑,还得分析你的逻辑合理性,说实话挺费时间的

碰到要经常性读写pickle的这种情况,其实你可以写2个函数,专门用来操作,一个读,一个写
读就提供1个参数,pickle文件的存放路径和文件名,返回一个字典
写就提供2个参数,pickle文件的存放路径和文件名,和一个字典,返回成功或失败,或者干脆不要返回值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-11-18 20:54:19 | 显示全部楼层
笨鸟学飞 发表于 2020-11-18 16:59
这里说下注意事项,自己检查下代码吧,实在是太长了懒得看
pickle每次读写都要注意,先open(), ...

虽然没有解决问题,不过你的方法对我还是很有用的,代码看起来好多了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 10:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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