【问题标题】:Python writing to JSON filePython写入JSON文件
【发布时间】:2021-07-18 21:48:31
【问题描述】:

这里面临的问题是,在我的代码中,有许多函数同时将数据转储到 json 文件中,例如,

""" Data of the JSON file is like
   {"Channels": [],1:[],2:[]} """

def update_channels():
 with open(file,'r') as f:
  data = json.load(f)
 data["Channels"].append(stuff)
 with open(file,'w') as f:
  json.dump(data,f)

def update_key(key_no):
 with open(file,'r') as f:
  data = json.load(f)
 data[key_no].append(stuff)
 with open(file,'w') as f:
  json.dump(data,f)

这些更新函数由事件触发,可能会同时执行或在没有时间间隔内执行,因此该 JSON 文件的数据可能会重叠,从而导致数据丢失。

我该如何解决这个问题?基本上,这是针对不和谐机器人的,这些功能将由不和谐事件触发。

谢谢!

【问题讨论】:

  • 这些函数是在线程中运行,还是该程序的多个实例并行运行?然后你会想要使用advisory locksdocs.python.org/3/library/fcntl.html
  • 您的问题有一个简单的解决方案。 停止使用 JSON 作为数据库。 使用数据库作为数据库。 Python 带有内置的 SQLite 支持 (import sqlite3)。建立一个数据库并将您的数据存储在那里。它并不比使用 JSON 更难,它更通用,速度更快,并且不会受到像这样的竞争条件的影响。
  • @deceze 这些函数是由 discord 事件触发的,例如,如果有两个人同时对一个 emoji 做出反应的情况,那么是的,这些函数将并行执行。跨度>
  • 不,你不会。如果您现在不转变,您将继续使用拼凑,因为它总是“离完美只有一拼”。 JSON 是您正在做的事情的可怕选择。您添加的每一个杂物都会使重做存储层变得更加困难。解决此类问题并没有明智地花费您的时间,因为您首先遇到这些问题的唯一原因是您做出了不可持续的设计选择。
  • 是的,使用数据库可以解决问题,因为数据库不像平面文件那样工作。它们保证事务和引用的完整性,这是它们的基本设计目标。

标签: python json discord.py


【解决方案1】:

有几种方法可以做到这一点。一种是使用数据库,它将为您进行访问控制。另一种是使用锁。但最简单的方法是将其留给内核:写入一个临时文件,然后原子地替换原始文件。 IE。要写入文件,请改为:

from tempfile import NamedTemporaryFile
import os

dirname = os.dirname(file)
with NamedTemporaryFile(dir=dirname, delete=False) as temp:
    json.dump(data, temp)
    temp.close()
    os.replace(temp.name, file)

Python 保证不会中断os.replace

编辑:这只是回答提出的问题;但我完全同意 cmets 所说的数据库是正确的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-07
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多