【问题标题】:How to read a json file with more than one records如何读取具有多个记录的json文件
【发布时间】:2020-05-21 11:59:11
【问题描述】:

我正在尝试保存游戏的高分并将其加载到高分部分,但我保存的方式会在 JSON 文件中添加多个记录。问题是在加载时,只有当有多个记录时,我才会收到错误json.decoder.JSONDecodeError: Extra data

我很确定this 是我的问题,但我是初学者,我无法理解它。

我在保存什么

score = {
    "score" : round_counter,
    "name" : player["name"],
    "hp left" : player["hitpoints"]
}

我如何保存它

if os.path.isfile('score.json'):
        print("your score has been added")
        json_dump = json.dumps(score)
        f = open("score.json","a")
        f.write(json_dump)
        f.close()  

else :
        print ("database doesn't exist so it was created!")
        json_dump = json.dumps(score)
        f = open("score.json","x")
        f.write(json_dump)
        f.close()      

我是怎么读的

with open ("score.json") as json_data:
    data = json.load(json_data)
    print(data)

它适用于第一次运行,但是当 .json 文件中有 2 条记录时,我无法读取它。我不知道我是否需要更完整的阅读代码,或者我在 .json 中保存多个字典的方式是根本错误的。

【问题讨论】:

    标签: python json


    【解决方案1】:

    要存储多个 JSON 记录,请使用数组,因为在加载时您可以只加载 JSON 类型(数组是您正在寻找该用例的理想 JSON 类型)。

    在这种情况下,读取所有分数:

    scores = []
    with open ("score.json") as json_data:
        scores = json.load(json_data)
    

    但最重要的是,将它们写入文件:

    scores.append(score)
    json_dump = json.dumps(scores)
    f = open("score.json","w")
    f.write(json_dump)
    f.close()    
    

    更新 最后的代码也可以用json.dump写:

    scores.append(score)
    f = open("score.json","w")
    json.dump(scores, f)
    f.write(json_dump)
    f.close()    
    

    【讨论】:

      【解决方案2】:

      按照您的代码编写方式,它将附加分数字典,而不是在分数数组中添加对象。

      如果您检查输出文件 score.json,它将看起来像 {...}{...}{...} 而它应该像 [{...},{...},{ ...}]

      【讨论】:

        【解决方案3】:

        您可以逐行读取文件,每一行都将包含一个有效的 JSON 对象:

        with open('score.json') as fp:
            for line in fp:
                data = json.loads(line)
                # do something with data
        

        或者,如果您需要一个对象中的所有内容:

        with open('score.json') as fp:
            data = []
            for line in fp:
                data.append(json.loads(line))
        

        【讨论】:

        • "你可以逐行读取文件,每一行都会包含一个有效的 JSON 对象:" => 好吧,不一定...
        • 只要不改动json.dumps()indent参数即可。
        猜你喜欢
        • 2015-04-25
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 2019-05-14
        相关资源
        最近更新 更多