如何将数据附加到json文件?

新手上路,请多包涵

我正在尝试创建一个将条目添加到 json 文件的函数。最后,我想要一个看起来像的文件

[{"name" = "name1", "url" = "url1"}, {"name" = "name2", "url" = "url2"}]

等这就是我所拥有的:

 def add(args):
    with open(DATA_FILENAME, mode='r', encoding='utf-8') as feedsjson:
        feeds = json.load(feedsjson)
    with open(DATA_FILENAME, mode='w', encoding='utf-8') as feedsjson:
        entry = {}
        entry['name'] = args.name
        entry['url'] = args.url
        json.dump(entry, feedsjson)

这确实会创建一个条目,例如 {"name"="some name", "url"="some url"} 。但是,如果我再次使用这个 add 函数,使用不同的名称和 url,第一个被覆盖。我需要做什么才能将第二个(第三个…)条目附加到第一个条目?

编辑:这个问题的第一个答案和评论指出了一个明显的事实,即我没有在写块中使用 feeds 。不过,我不知道该怎么做。例如,以下显然不会做:

 with open(DATA_FILENAME, mode='a+', encoding='utf-8') as feedsjson:
    feeds = json.load(feedsjson)
    entry = {}
    entry['name'] = args.name
    entry['url'] = args.url
    json.dump(entry, feeds)

原文由 Schiphol 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 261
2 个回答

json 可能不是磁盘格式的最佳选择;它在附加数据时遇到的麻烦是一个很好的例子,说明了为什么会这样。具体来说,json 对象的语法意味着必须读取和解析整个对象才能理解其中的任何部分。

幸运的是,还有很多其他选择。一个特别简单的是 CSV; python 的标准库很好地支持它。最大的缺点是它只适用于文本;如果需要,它需要程序员采取额外的措施将值转换为数字或其他格式。

另一个没有此限制的选项是使用 sqlite 数据库,它在 python 中也有内置支持。这可能与您已有的代码有更大的不同,但它更自然地支持您显然正在尝试构建的“稍微修改一下”模型。

原文由 SingleNegationElimination 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可能希望使用 JSON 列表 而不是字典作为顶层元素。

因此,用一个空列表初始化文件:

 with open(DATA_FILENAME, mode='w', encoding='utf-8') as f:
    json.dump([], f)

然后,您可以将新条目 附加 到此列表:

 with open(DATA_FILENAME, mode='w', encoding='utf-8') as feedsjson:
    entry = {'name': args.name, 'url': args.url}
    feeds.append(entry)
    json.dump(feeds, feedsjson)

请注意,这执行起来会很慢,因为每次调用 add 时都会重写文件的全部内容。如果您在循环中调用它,请考虑提前将所有提要添加到一个列表中,然后一次性写出该列表。

原文由 nneonneo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏