标题:Python 文件保存异常
只看楼主
星星对你眨眼
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2019-4-21
结帖率:100%
已结贴  问题点数:20 回复次数:7 
Python 文件保存异常
程序代码:
print("|---欢迎进入通讯录程序---|")
print("|---1:查询联系人资料 ---|")
print("|---2:插入新的联系人 ---|")
print("|---3:删除已有联系人 ---|")
print("|---4:查看通讯录信息 ---|")
print("|---5:退出通讯录程序 ---|")
try:
    file=open("Data.pyab","a+")
    dict=eval(file.readline())
except:
    file=open("Data.pyab","w")
    dict={}
while(1):
    n=input("请输入相关的指令代码:")
    if(n=='1'):
        key=input("请输入联系人姓名:")
        if key in dict:
            print(key+":"+dict[key])
        else:
            print("无此联系人!")
    elif(n=='2'):
        key=input("请输入联系人姓名:")
        if(key in dict):
            print("您输入的姓名在通讯录中已存在"+"-->>"+key+":"+dict[key])
            lis=input("是否修改用户资料(yes/no):")
            if iis=="yes":
                value=input("请输入用户联系电话:")
                dict[key]=value
        else:
            value=input("请输入联系人电话:")
            dict[key]=value
    elif(n=='3'):
        key=input("请输入联系人姓名:")
        del dict[key]
        print("已删除"+key)
    elif(n=='5'):
        print("|---感谢使用通讯录程序---|")
        strdict=str(dict)
        print(strdict)
        input("")
        file.truncate()
        file.seek(0)
        file.write(strdict)
        file.close
        break

问题:
每次打开程序时,例如输入
小明 110
小红 119
退出程序后,Data.pyab内容:
{"小明":"110","小红":"119"}
没有错误.
但如果再次打开程序,输入
小黄 119
那么退出程序后,Data.pyab的内容就变成了只有
{"小黄":"119"}
之前输入的内容就会不见
搜索更多相关主题的帖子: dict 输入 key 联系人 print 
2019-10-10 23:06
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:0 
明显是覆盖式存盘  你想要的模式是追加式存盘

DO IT YOURSELF !
2019-10-11 08:36
星星对你眨眼
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2019-4-21
得分:0 
open("Data.pyab","a+")不是追加模式吗?
2019-10-11 12:24
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:版主
威 望:422
帖 子:13681
专家分:53296
注 册:2012-10-18
得分:8 
回复 3楼 星星对你眨眼
你试一试 file=open("Data.pyab","r+")

我也没搞明白 a+ 为啥不可以  等我弄明白了 再告诉你

DO IT YOURSELF !
2019-10-11 14:47
fall_bernana
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:17
帖 子:240
专家分:2086
注 册:2019-8-16
得分:12 
以下是引用星星对你眨眼在2019-10-10 23:06:10的发言:


print("|---欢迎进入通讯录程序---|")
print("|---1:查询联系人资料 ---|")
print("|---2:插入新的联系人 ---|")
print("|---3:删除已有联系人 ---|")
print("|---4:查看通讯录信息 ---|")
print("|---5:退出通讯录程序 ---|")
try:
    file=open("Data.pyab","a+")
    dict=eval(file.readline())
except:
    file=open("Data.pyab","w")
    dict={}
while(1):
    n=input("请输入相关的指令代码:")
    if(n=='1'):
        key=input("请输入联系人姓名:")
        if key in dict:
            print(key+":"+dict[key])
        else:
            print("无此联系人!")
    elif(n=='2'):
        key=input("请输入联系人姓名:")
        if(key in dict):
            print("您输入的姓名在通讯录中已存在"+"-->>"+key+":"+dict[key])
            lis=input("是否修改用户资料(yes/no):")
            if iis=="yes":
                value=input("请输入用户联系电话:")
                dict[key]=value
        else:
            value=input("请输入联系人电话:")
            dict[key]=value
    elif(n=='3'):
        key=input("请输入联系人姓名:")
        del dict[key]
        print("已删除"+key)
    elif(n=='5'):
        print("|---感谢使用通讯录程序---|")
        strdict=str(dict)
        print(strdict)
        input("")
        file.truncate()
        file.seek(0)
        file.write(strdict)
        file.close
        break

问题:
每次打开程序时,例如输入
小明 110
小红 119
退出程序后,Data.pyab内容:
{"小明":"110","小红":"119"}
没有错误.
但如果再次打开程序,输入
小黄 119
那么退出程序后,Data.pyab的内容就变成了只有
{"小黄":"119"}
之前输入的内容就会不见


首先你的程序有几个问题:
1.你在使用try ... except ...的时候需要
try:
    ...
except Exception as e:
    print(e)
    ...
否则try里面报错你根本就不知道.象你这里程序由于try里有错误一直是在except里.try里面根本没进去.

2. 你得明白a+的含义是指文件打开.并且把文件指针移动到文件的最后.所以你的file.readline()永远是空,也就导致了你的eval(file.readline())会报unexpected EOF while parsing (<string>, line 0)的错误

3.file.truncate(size)指的是从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;file.seek(0)方法用于移动文件读取指针到指定位置。
我理解你的意思是想把文件清空,重新写入dict的内容.那么你应该先seek,再truncate.就是先把文件指针移动到文件的最开始,然后截掉后面的数据.否则就是往里面写了以追加的形式写入所有的dict
类似于 {'tt':1}{'ss':1}
4.你可以在开始最前面
程序代码:
with open("Data.pyab","r") as f:
    dict=eval(f.readline())
    print(dict)

然后直接使用 file=open("Data.pyab","w")写入所有的dict

[此贴子已经被作者于2019-10-11 15:49编辑过]

2019-10-11 15:39
星星对你眨眼
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2019-4-21
得分:0 
谢谢两位,问题已解决
2019-10-11 20:35
黄明礼
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-11-29
得分:0 
回复 6楼 星星对你眨眼
aw是不是也行
2019-11-30 11:10
bczgsky
Rank: 2
等 级:论坛游民
威 望:1
帖 子:10
专家分:20
注 册:2019-12-5
得分:0 
要用a,追加模式
2019-12-06 15:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-497177-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.063732 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved