黑色游民 2022-11-20 19:48 采纳率: 100%
浏览 7
已结题

请问怎么读取存储在json文件中的字典

#问题背景

自学Python两星期,学到json模块,心血来潮想做一个能够存储账号密码的程序,前面正常,但写到最后,不知道怎么读取存储在json文件中的字典信息,因此一直报错。

#版本环境
版本:Python3.10
环境:Windows10

#期望结果
存储用户输入的信息,包含账号密码和安全问题(作为两组字典存储在新创建的json文件中),然后弹出安全问题,将用户输入的答案同文件中存储的信息对比,回答正确则输出账号与密码,反之输出“回答错误”。

#代码


import json
q1 = input('请输入你的账号:\n')
q2 = input('请输入你的密码:\n')
key_data = {'account': q1, 'key': q2}

with open('user_data.json', 'w', encoding='utf_8') as f:
    json.dump(key_data, f)
    print(f"你的账号已经存储完毕。接下来请设置安全问题:\n")

answer1 = input('你的生日?\n')
answer2 = input('你的姓名?\n')
question = {'birthday': answer1, 'full_name': answer2}

with open('user_data.json', 'a', encoding='utf_8') as ff:
    json.dump(question, ff)
    print(f"安全问题设置完毕。此后完成安全问题的回答即可获取账号与密码。\n")

active1 = input('访问账号密码请输入以下安全问题:\n你的生日?\n')
with open('user_data.json', 'r', encoding='utf_8') as fff:
    call = json.load(fff)
    if active1 == call['birthday']:
        active2 = input('回答正确。进入下个问题:你的姓名?\n')
        if active2 == call['full_name']:
            print('全部回答正确。现在你可以获取你的账号密码了。\n')
            print(call[key_data])
        else:
            print('回答错误。')
    else:
        print('回答错误。')

#报错描述


Traceback (most recent call last):
  File "C:\Users\11479\AppData\Roaming\JetBrains\PyCharmCE2022.2\scratches\scratch_5.py", line 20, in <module>
    call = json.load(fff)
  File "D:\Python\lib\json\__init__.py", line 293, in load
    return loads(fp.read(),
  File "D:\Python\lib\json\__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "D:\Python\lib\json\decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 1 column 33 (char 32)
  • 写回答

2条回答 默认 最新

  • IT从业者张某某 人工智能领域新星创作者 2022-11-20 20:19
    关注

    微调了你的代码,应该可行了
    加油,欢迎关注

    import json
    q1 = input('请输入你的账号:\n')
    q2 = input('请输入你的密码:\n')
    key_data = {'account': q1, 'key': q2}
    # with open('user_data.json', 'w', encoding='utf_8') as f:
    #     # json.dump(key_data, f)
    print(f"你的账号已经存储完毕。接下来请设置安全问题:\n")
    answer1 = input('你的生日?\n')
    answer2 = input('你的姓名?\n')
    question = {'birthday': answer1, 'full_name': answer2}
    # 存储多个字典数据
    json_list = []
    
    json_list.append(key_data)
    json_list.append(question)
    with open('user_data.json', 'w', encoding='utf_8') as ff:
        # 写入list封装的字典
        json.dump(json_list, ff)
        print(f"安全问题设置完毕。此后完成安全问题的回答即可获取账号与密码。\n")
    active1 = input('访问账号密码请输入以下安全问题:\n你的生日?\n')
    with open('user_data.json', 'r', encoding='utf_8') as fff:
        call = json.load(fff)
        # 先获取字典中的第2个元素,在获取其字典中 的birthday值
        if active1 == call[1]['birthday']:
            active2 = input('回答正确。进入下个问题:你的姓名?\n')
            # 先获取字典中的第2个元素,在获取其字典中 full_name值
            if active2 == call[1]['full_name']:
                print('全部回答正确。现在你可以获取你的账号密码了。\n')
                # 输出用户名和密码
                print(call[0])
            else:
                print('回答错误。')
        else:
            print('回答错误。')
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月28日
  • 已采纳回答 11月20日
  • 创建了问题 11月20日

悬赏问题

  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)