在 Python 中添加字典条目并附加到 JSON 文件的最佳方法

JD2*_*775 6 python json dictionary

我需要使用以下键将条目添加到字典中:

name
element
type
Run Code Online (Sandbox Code Playgroud)

我希望每个条目都附加到一个 JSON 文件,我将在其中访问它们以用于项目的另一部分。

我下面的内容在技术上是可行的,但是(至少)有一些问题。

首先,它不会阻止重复输入。例如,我可以让“xyz”、“4444”和“test2”多次作为 JSON 条目出现。有办法纠正这个问题吗?

是否有一种更清晰的方法来编写实际的数据输入部分,以便当我将这些值输入到字典中时,它不会直接出现在括号中?

最后,还有更好的地方来放置 JSON 片段吗?它应该在函数内部吗?

只是想把这个清理一下。谢谢

import json

element_dict = {}


def add_entry(name, element, type):

        element_dict["name"] = name
        element_dict["element"] = element
        element_dict["type"] = type
        return element_dict


#add entry
entry = add_entry('xyz', '4444', 'test2')


#export to JSON
with open('elements.json', 'a', encoding="utf-8") as file:
    x = json.dumps(element_dict, indent=4)
    file.write(x + '\n')
Run Code Online (Sandbox Code Playgroud)

jpp*_*jpp 4

这里有几个问题。值得一提的要点:

  • Use 可以使用 alist来保存您的参数,并*args在将它们提供给 时使用来解压add_entry
  • 要检查/避免重复,您可以使用set跟踪已添加的项目。
  • 为了写入 JSON,现在您有了一个列表,您可以简单地迭代列表并在最后写入一个函数。

将这些方面放在一起:

import json

res = []
seen = set()

def add_entry(res, name, element, type):

    # check if in seen set
    if (name, element, type) in seen:
        return res

    # add to seen set
    seen.add(tuple([name, element, type]))

    # append to results list
    res.append({'name': name, 'element': element, 'type': type})

    return res

args = ['xyz', '4444', 'test2']

res = add_entry(res, *args)  # add entry - SUCCESS
res = add_entry(res, *args)  # try to add again - FAIL

args2 = ['wxy', '3241', 'test3']

res = add_entry(res, *args2)  # add another - SUCCESS
Run Code Online (Sandbox Code Playgroud)

结果:

print(res)

[{'name': 'xyz', 'element': '4444', 'type': 'test2'},
 {'name': 'wxy', 'element': '3241', 'type': 'test3'}]
Run Code Online (Sandbox Code Playgroud)

通过函数写入 JSON:

def write_to_json(lst, fn):
    with open(fn, 'a', encoding='utf-8') as file:
        for item in lst:
            x = json.dumps(item, indent=4)
            file.write(x + '\n')

#export to JSON
write_to_json(res, 'elements.json')
Run Code Online (Sandbox Code Playgroud)