在Python中更新JSON文件

4
我想要更新的.json文件具有以下结构:
{
  "username": "abc",
  "statistics": [
    {
      "followers": 1234,
      "date": "2018-02-06 02:00:00",
      "num_of_posts": 123,
      "following": 123
    }
  ]
}

我想让它插入一个新的统计数据,像这样

{
  "username": "abc",
  "statistics": [
    {
      "followers": 1234,
      "date": "2018-02-06 02:00:00",
      "num_of_posts": 123,
      "following": 123
    },
    {
      "followers": 2345,
      "date": "2018-02-06 02:10:00",
      "num_of_posts": 234,
      "following": 234
    }
  ]
}

在处理

with open(filepath, 'w') as fp:
    json.dump(information, fp, indent=2)

文件将始终被覆盖。但是我希望将统计信息中的项目添加进去。我尝试了许多可能的方式来读取文件并在后面追加,但从未成功。

数据写入information变量中,就像这样:

information = {
  "username": username,
  "statistics": [
      {
          "date": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
          "num_of_posts": num_of_posts,
          "followers": followers,
          "following": following
      }
  ]
}

那么我该如何更新我的 .json 文件,以确保我的信息被正确添加?

1
json.reads, modify, json.dump - iBug
尝试以多种可能的方式读取文件并在之后追加,但从未成功。请展示那个代码。 - OneCricketeer
1
这是一个文件,而不是数据库。使用CSV文件,可以将新行附加到末尾。然而,修改JSON对象需要直接修改文件并调整所需的括号、逗号或括号。您最好将文件作为JSON读取,修改您的对象,然后使用json.dump用新对象覆盖文件。 - Alexander
你可能需要咬紧牙关,调查使用NoSQL数据库,例如MongoDB(https://www.mongodb.com/)。任何基于文件的方法的问题在于每次更改后必须重新编写整个文件。如果文件很大,则这变得越来越昂贵,特别是如果进行了许多小更改。数据库解决方案将更加高效。 - Alexander
谢谢@Alexander!我认为你是对的,我现在正在使用简单的csv来存储我的数据。 - lucanello
显示剩余2条评论
4个回答

7
你需要做的是类似于以下操作: ```html

你需要做的是类似于以下操作:

```
def append_statistics(filepath, num_of_posts, followers, following):

    with open(filepath, 'r') as fp:
        information = json.load(fp)

    information["statistics"].append({
        "date": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        "num_of_posts": num_of_posts,
        "followers": followers,
        "following": following
    })

    with open(filepath, 'w') as fp:
        json.dump(information, fp, indent=2)

1
谢谢 :) 这真的帮了我很多!我终于能够读取文件并修改它了。尽管我认为 JSON 语法对于这个小项目来说过于严格了。这就是为什么我现在正在使用 csv,这让我的工作变得更加容易。 - lucanello
1
@lucanello 很高兴能帮到你。对于这个任务,CSV听起来是一个不错的选择,因为你可以每次只需将内容附加到文件末尾,而无需每次都重写它。 - Jesper

0
你需要读取 .json 文件,然后追加新的数据集并将其转储。请参考以下代码。
import json
appending_statistics_data = {}

appending_statistics_data["followers"] =  2346
appending_statistics_data["date"] = "2018-02-06 02:10:00"
appending_statistics_data["num_of_posts"] =  234
appending_statistics_data["following"] = 234

with open(file.json, 'r') as fp:
    data = json.load(fp)

data['statistics'].append(appending_statistics_data)    
#print(json.dumps(data,indent=4))               


with open(file.json, 'w') as fp:
    json.dump(data, fp, indent=2)

0
你可以使用这个函数:
def append_statistics(filepath, num_of_posts, followers, following):
    new_statistics_record={
        "date": datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        "num_of_posts": num_of_posts,
        "followers": followers,
        "following": following
    }

    with open(filepath, 'r') as fp:
        information = json.load(fp)

    information["statistics"].append(new_statistics_record)

    with open(filepath, 'w') as fp:
        json.dump(information, fp, indent=2)

-1
通常情况下,您不会直接更新正在读取的文件。
您可以考虑以下步骤:
  1. 从源文件中读取。
  2. 进行处理。
  3. 将其写入新的临时文件。
  4. 关闭源文件和临时文件。
  5. 将临时文件重命名(移动)为源文件。

这看起来像是一条评论,而不是一个答案。 - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接