注册 登录
编程论坛 Python论坛

Python 文件保存异常

星星对你眨眼 发布于 2019-10-10 23:06, 2967 次点击
程序代码:

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"}
之前输入的内容就会不见
7 回复
#2
wp2319572019-10-11 08:36
明显是覆盖式存盘  你想要的模式是追加式存盘
#3
星星对你眨眼2019-10-11 12:24
open("Data.pyab","a+")不是追加模式吗?
#4
wp2319572019-10-11 14:47
回复 3楼 星星对你眨眼
你试一试 file=open("Data.pyab","r+")

我也没搞明白 a+ 为啥不可以  等我弄明白了 再告诉你
#5
fall_bernana2019-10-11 15:39
以下是引用星星对你眨眼在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编辑过]

#6
星星对你眨眼2019-10-11 20:35
谢谢两位,问题已解决
#7
黄明礼2019-11-30 11:10
回复 6楼 星星对你眨眼
aw是不是也行
#8
bczgsky2019-12-06 15:56
要用a,追加模式
1