如何将字典列表保存到文件中?

43

我有一个字典列表。偶尔,我想更改并保存其中一个字典,以便在重新启动脚本时使用新的消息。目前,我通过修改脚本并重新运行来进行更改。我想将这个过程从脚本中分离出来,并将字典列表放入某种配置文件中。

我找到了如何将列表写入文件的答案,但这假定它是一个扁平的列表。我如何处理一个字典列表?

我的列表长这样:

logic_steps = [
    {
        'pattern': "asdfghjkl",
        'message': "This is not possible"
    },
    {
        'pattern': "anotherpatterntomatch",
        'message': "The parameter provided application is invalid"
    },
    {
        'pattern': "athirdpatterntomatch",
        'message': "Expected value for debugging"
    },
]

你对JSONL/JSON Lines有什么看法?请参考以下链接:https://ml-gis-service.com/index.php/2022/04/27/toolbox-python-list-of-dicts-to-jsonl-json-lines/ - Charlie Parker
5个回答

77

只要对象仅包含JSON可以处理的对象(liststuplesstringsdictsnumbersNoneTrueFalse),您可以将其转储为json.dump

import json
with open('outputfile', 'w') as fout:
    json.dump(your_list_of_dict, fout)

6
我收到了一个错误,内容为“TypeError: -0.69429028 is not JSON serializable”。 - Mona Jalal
当我从文件中导入数据时,我需要在json.dump之前添加fout.write("data = ") - Cyrus
JSONL/JSON Lines怎么样? - Charlie Parker

19

如果您希望每个字典都在一行中:

 import json
 output_file = open(dest_file, 'w', encoding='utf-8')
 for dic in dic_list:
    json.dump(dic, output_file) 
    output_file.write("\n")

什么是dest_file? - Eliza R
@ElizaR dest_file 是目标文件的位置。在 Linux 上,它可以是类似于 /home/user/file 的东西。 - zwep
JSONL/JSON Lines怎么样? - Charlie Parker

7

为了完整性,我还要添加json.dumps()方法:

with open('outputfile_2', 'w') as file:
    file.write(json.dumps(logic_steps, indent=4))

点击这里,查看在Python中json.dump()json.dumps()之间的区别。


3
您需要遵循的写入字典到文件的方式与您提到的文章有所不同。首先,您需要对对象进行序列化,然后将其持久化。这些都是“将Python对象写入文件”的花哨名称。
Python默认包含3个序列化模块,您可以使用它们来实现您的目标。它们是:pickle、shelve和json。每个模块都有自己的特点,您应该根据项目选择最合适的模块。您可以查看每个模块的文档以获取更多信息。
如果您的数据仅由Python代码访问,则可以使用shelve。以下是一个示例:
import shelve

my_dict = {"foo":"bar"}

# file to be used
shelf = shelve.open("filename.shlf")

# serializing
shelf["my_dict"] = my_dict

shelf.close() # you must close the shelve file!!!

要检索数据,您可以执行以下操作:

import shelve

shelf = shelve.open("filename.shlf") # the same filename that you used before, please
my_dict = shelf["my_dict"]
shelf.close()

注意到你可以几乎以相同的方式处理 shelve 对象,就像处理字典一样。


0

这个问题的被接受答案同样完美地解决了这个问题。它使用pickle而不是json来透明地管理数据转储,即使在字典列表的情况下也是如此:

import pickle

list_of_dicts = [{'a': 1, 'b': 2}, {'aa': 2, 'bb': 3}]

with open('saved_list.pkl', 'wb') as f:
    pickle.dump(list_of_dicts, f)
        
with open('saved_list.pkl', 'rb') as f:
    loaded_list_of_dicts = pickle.load(f)

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