鱼C论坛

 找回密码
 立即注册
查看: 1294|回复: 4

[已解决]文件储存问题

[复制链接]
发表于 2022-4-4 10:09:26 | 显示全部楼层 |阅读模式

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

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

x
print('''|---欢迎进入成绩录入程序---|
|---1:查询学生成绩:---|
|---2:插入新的同学成绩---|
|---3:修改已有同学成绩---|
|---4:退出成绩录入程序---|''')

import pickle
c = {}
while 1:
    temp = input('请输入相关的指令:')
    if temp == '2':
        while 1:
            a = open('E:/成绩单.pkl', 'rb')
            c = pickle.load(a)
            tem = input('插入,请重新输入名字(输入数字结束程序):')
            if tem.isdigit():
                break
            while 1:
                if tem in c:
                    tem = input('同学成绩已存在,请重新输入名字:')
                else:
                    break
            c[tem] = input('请输入分数:')  # list(map(lambda x,y:[x,y],a,b)) 、list(zip(a,b)
            a = open('E:/成绩单.pkl', 'wb')
            pickle.dump(c, a)
            a.close()
    if temp == '1':
        while 1:
            a = open('E:/成绩单.pkl', 'rb')
            c = pickle.load(a)
            tem = input('请输入名字(查询,输入数字结束程序):')
            if tem.isdigit():
                break
            if tem in c:
                print(tem, '的成绩是:', c[tem])
            else:
                print('查找不到')
        a = open('E:/成绩单.pkl', 'wb')
        pickle.dump(c, a)
        a.close()
    if temp == '3':
        while 1:
            a = open('E:/成绩单.pkl', 'rb')
            c = pickle.load(a)
            tem = input('请输入修改同学的名字(修改,输入数字结束程序):')
            if tem.isdigit():
                break
            if tem in c:
                c[tem] = input('请输入修改的成绩:')
            else:
                print('查找不到')
        a = open('E:/成绩单.pkl', 'wb')
        pickle.dump(c, a)
        a.close()
    if temp == '4':
        print('退出程序,再见')
        break



这个数据储存有问题,请问有什么解决问题吗
最佳答案
2022-4-4 11:09:24
不建议将对 pickle 文件的读取放在循环里面,应该在一开始就把它读取到一个字典,

然后在循环处理,故对你的代码修改如下:

  1. import os
  2. import pickle

  3. print('''|---欢迎进入成绩录入程序---|
  4. |---1:查询学生成绩:---|
  5. |---2:插入新的同学成绩---|
  6. |---3:修改已有同学成绩---|
  7. |---4:退出成绩录入程序---|''')

  8. # 先判断 成绩单.pkl 是否存在,不存在则创建一个空成绩单
  9. if not os.path.exists('成绩单.pkl'):
  10.     with open('成绩单.pkl', 'wb') as f:
  11.         pickle.dump({}, f)

  12. # 把 成绩单 先读取到 score,在循环里不再读取 成绩单,直接对 score 操作
  13. with open('成绩单.pkl', 'rb') as f:
  14.     score = pickle.load(f)

  15. while 1:
  16.     temp = input('请输入相关的指令:')
  17.     if temp == '2':
  18.         while 1:
  19.             tem = input('插入,请重新输入名字(输入数字结束程序):')
  20.             if tem.isdigit():
  21.                 break
  22.             while 1:
  23.                 if tem in score:
  24.                     tem = input('同学成绩已存在,请重新输入名字:')
  25.                 else:
  26.                     break
  27.             score[tem] = input('请输入分数:')  # list(map(lambda x,y:[x,y],a,b)) 、list(zip(a,b)
  28.             a = open('成绩单.pkl', 'wb')
  29.             pickle.dump(score, a)
  30.             a.close()
  31.     if temp == '1':
  32.         while 1:
  33.             tem = input('请输入名字(查询,输入数字结束程序):')
  34.             if tem.isdigit():
  35.                 break
  36.             if tem in score:
  37.                 print(tem, '的成绩是:', score[tem])
  38.             else:
  39.                 print('查找不到')
  40.         a = open('成绩单.pkl', 'wb')
  41.         pickle.dump(score, a)
  42.         a.close()
  43.     if temp == '3':
  44.         while 1:
  45.             a = open('成绩单.pkl', 'rb')
  46.             c = pickle.load(a)
  47.             tem = input('请输入修改同学的名字(修改,输入数字结束程序):')
  48.             if tem.isdigit():
  49.                 break
  50.             if tem in score:
  51.                 score[tem] = input('请输入修改的成绩:')
  52.             else:
  53.                 print('查找不到')
  54.         a = open('成绩单.pkl', 'wb')
  55.         pickle.dump(score, a)
  56.         a.close()
  57.     if temp == '4':
  58.         print('退出程序,再见')
  59.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-4 10:11:59 From FishC Mobile | 显示全部楼层
都不说啥问题谁知道你有啥问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-4 11:09:24 | 显示全部楼层    本楼为最佳答案   
不建议将对 pickle 文件的读取放在循环里面,应该在一开始就把它读取到一个字典,

然后在循环处理,故对你的代码修改如下:

  1. import os
  2. import pickle

  3. print('''|---欢迎进入成绩录入程序---|
  4. |---1:查询学生成绩:---|
  5. |---2:插入新的同学成绩---|
  6. |---3:修改已有同学成绩---|
  7. |---4:退出成绩录入程序---|''')

  8. # 先判断 成绩单.pkl 是否存在,不存在则创建一个空成绩单
  9. if not os.path.exists('成绩单.pkl'):
  10.     with open('成绩单.pkl', 'wb') as f:
  11.         pickle.dump({}, f)

  12. # 把 成绩单 先读取到 score,在循环里不再读取 成绩单,直接对 score 操作
  13. with open('成绩单.pkl', 'rb') as f:
  14.     score = pickle.load(f)

  15. while 1:
  16.     temp = input('请输入相关的指令:')
  17.     if temp == '2':
  18.         while 1:
  19.             tem = input('插入,请重新输入名字(输入数字结束程序):')
  20.             if tem.isdigit():
  21.                 break
  22.             while 1:
  23.                 if tem in score:
  24.                     tem = input('同学成绩已存在,请重新输入名字:')
  25.                 else:
  26.                     break
  27.             score[tem] = input('请输入分数:')  # list(map(lambda x,y:[x,y],a,b)) 、list(zip(a,b)
  28.             a = open('成绩单.pkl', 'wb')
  29.             pickle.dump(score, a)
  30.             a.close()
  31.     if temp == '1':
  32.         while 1:
  33.             tem = input('请输入名字(查询,输入数字结束程序):')
  34.             if tem.isdigit():
  35.                 break
  36.             if tem in score:
  37.                 print(tem, '的成绩是:', score[tem])
  38.             else:
  39.                 print('查找不到')
  40.         a = open('成绩单.pkl', 'wb')
  41.         pickle.dump(score, a)
  42.         a.close()
  43.     if temp == '3':
  44.         while 1:
  45.             a = open('成绩单.pkl', 'rb')
  46.             c = pickle.load(a)
  47.             tem = input('请输入修改同学的名字(修改,输入数字结束程序):')
  48.             if tem.isdigit():
  49.                 break
  50.             if tem in score:
  51.                 score[tem] = input('请输入修改的成绩:')
  52.             else:
  53.                 print('查找不到')
  54.         a = open('成绩单.pkl', 'wb')
  55.         pickle.dump(score, a)
  56.         a.close()
  57.     if temp == '4':
  58.         print('退出程序,再见')
  59.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-4 11:34:04 | 显示全部楼层
isdkz 发表于 2022-4-4 11:09
不建议将对 pickle 文件的读取放在循环里面,应该在一开始就把它读取到一个字典,

然后在循环处理,故对 ...

非常感谢,是我的格局小了,你的方法很好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-4 15:04:56 | 显示全部楼层
QQ小鱼 发表于 2022-4-4 11:34
非常感谢,是我的格局小了,你的方法很好

大神,可以帮我看下,我另外一个问题吗?我已经发帖子了,就是读取不了文件的内容,老是报错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 06:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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