【问题标题】:How to insert dicts into a JSON array file?如何将字典插入 JSON 数组文件?
【发布时间】:2016-12-10 00:42:33
【问题描述】:

我编写了一个小的 Python 脚本,它使用speedtest-cli 来获得我的互联网速度。我打算创建一个装置,我的 Python 脚本将速度数据存储在磁盘上已经存在的 JSON 数组文件中,然后设置一个小型网页设置来查看数据。

无论如何,我已将我的脚本配置为在脚本末尾吐出一个dict,如下所示:

{
    "downSpeed": 90.30834444821808,
    "humanTime": "Fri Dec  9 18:02:54 2016",
    "time": 1481328174225.999,
    "upSpeed": 13.698571043448549
}

我在磁盘上有一个 JSON 文件,它只是一个带有两个括号的文件,表示 JSON 数组,在该数组中,我希望我的脚本将 dicts 放在 JSON 数组中,用逗号分隔以表示dicts 在 JSON 中作为 objects。我的问题是如何将我的数据输入 JSON 文件?我遇到的所有解决方案都提到了使用open 函数和a 选项。但是,这有几个问题,首先,数据被附加到文件中,并且 JSON 的最后一个括号被切断,因为数据正在被附加。其次,由于我打算经常运行这个脚本,我担心我会遇到一个问题,即 JSON 文件会很长,因此脚本需要很长时间才能处理。那么,我在这里有什么选择?是否有另一种方法可以将 dict 插入 JSON 数组(我猜这在 Python 中大致翻译为 list)?

【问题讨论】:

    标签: python arrays json list dictionary


    【解决方案1】:

    您熟悉python JSON 模块吗? https://docs.python.org/2/library/json.html 您可以使用 dumps() 将 python 对象直接写入 JSON 文件。 来自网站的示例:

        import json
        print json.dumps({'4': 5, '6': 7}, sort_keys=True,
                          indent=4, separators=(',', ': '))
    
        {
            "4": 5,
            "6": 7
    
        }
    

    【讨论】:

    • 是的,没错,但这并不能解决我的问题,如果我有一个已经存在的 JSON 数组,我将如何将对象插入其中?
    【解决方案2】:

    一般来说,没有简单的方法可以在文件中间插入一些东西。因此,您必须解析所有 JSON 以在内存中创建一个列表,附加一个项目,然后再次转储它。或者你可以用逗号和方括号来手动操作 JSON 数组。

    在这种情况下,一个更好的选择是忘记 JSON 数组并将每个 JSON 对象存储在一行中。这样您就可以使用追加模式,也可以轻松地遍历对象,而无需将整个文件加载到内存中。

    【讨论】:

    • 我能用 JS 解析吗?因为那不会是语法正确的 JSON?
    • javascript 是如何进入这个领域的?无论如何,是的,在 javascript 中将一个大字符串拆分为单独的行并分别解析每一行应该很容易。
    • 啊,有道理!在我的 OP 中,我提到我还想要一个小型网站来解析 JSON 并显示数据,我会使用 JavaScript 来解析 JSON 中的数据
    【解决方案3】:

    如果您想将 JSON 代码附加到已经存在的 JSON 文件 (.json) 中,那么您只需要使用 Python 的 json 模块即可。假设您有一个名为 test.json 的文件,其中包含代码,

    [ "Hello World!", "Testing 1, 2, 3." ]
    

    然后您想将以下 Python 字典追加到列表中。

    { "Hello World!": 123, "Test": None }
    

    python 代码如下所示。

    import json # import the module
    
    code = json.load(open('test.json','r')) # load the current data
    adding_dict = # put the python dictionary here,
                  # it can even be a class if it returns a dictionary.
    new_dict = code.append(adding_dict) # append the dictionary to the list
    # then we dump it to the file.
    json.dump(new_dict, open('test.json', 'w'))
    

    如果您想了解更多信息,请访问 Python 的文档站点,here.

    【讨论】:

    • 嗯,很奇怪,在我这样做之后,它只是在第一行的 JSON 文件中写入了null,没有别的。这是我想出的代码:jsonData = json.dumps(speedData, sort_keys=True, indent=4, separators=(',', ': ')) existingJson = json.load(open('allSpeedData.json', 'r')) #Existing JSON array insertJson = existingJson.append(jsonData) json.dump(insertJson, open('allSpeedData.json', 'w'))
    • 尝试使用 print 调试您的代码。打印出您创建的任何变量。请在代码中使用;s 换行,否则很难阅读。问题是您的 insertJson 变量。它只需要是existingJson.append(jsonData),然后当你转储它时使用existingJson。当追加到列表时,Python 不会返回完整列表,它只是“追加”或添加到原始列表中。
    【解决方案4】:
    import jsonlines
    
    net_speed = {
                   "downSpeed": 90.30834444821808,
                   "humanTime": "Fri Dec  9 18:02:54 2016",
                   "time": 1481328174225.999,
                   "upSpeed": 13.698571043448549
                }
    
    # net.jsonl is the name of the file
    with jsonlines.open("net.jsonl", "a") as writer:   # for writing
        writer.write(net_speed)
    
    with jsonlines.open('net.jsonl') as reader:      # for reading
        for obj in reader:
            print(obj)             
    

    访问https://jsonlines.readthedocs.io/en/latest/了解更多信息

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      相关资源
      最近更新 更多