如何将 OrderedDicts 写入文件并将其读回列表?

Posted

技术标签:

【中文标题】如何将 OrderedDicts 写入文件并将其读回列表?【英文标题】:How to write OrderedDicts into a file and read it back to a list? 【发布时间】:2017-06-19 14:02:07 【问题描述】:

我有一个返回 collections.OrderedDict() 的函数,它是 http post 的有效负载。

当http post失败时我需要记录离线数据,所以我想将所有dicts写入文件并将其作为列表读回,我知道我可以创建一个列表并继续附加到列表中,但需要的是写入文件并读回列表,

有人可以帮我解决这个问题吗,请建议是否有更好的方法来检索 dict 项目作为列表

【问题讨论】:

不使用文件你愿意吗? list(dictionary.items() 感谢彼得的回复,文件写入是强制性的,因为 dicts 可能会增长到数万个并且不建议保留列表:( 嘿,克里斯,我可以使用 pickle 将新的字典条目附加到文件中吗? 【参考方案1】:

您可以将字典列表转换为json 并将其保存到.json 文件中。 然后,阅读它将是小菜一碟。

from collections import OrderedDict
import json
dic = OrderedDict()
dic['hello'] = 'what up'
dic_2 = OrderedDict()
dic_2['hey, second'] = 'Nothing is up'

with open('file.json', 'w') as f:
    dictionaries = [dic, dic_2]
    f.write(json.dumps(dictionaries))
with open('file.json', 'r') as read_file:
    loaded_dictionaries = json.loads(read_file.read())
    print(loaded_dictionaries[0])

输出:

'hello': 'what up'

只要字典键/值是以下类型中的任何一种,这将正常工作:dict, list, str, int, float, bool, None

【讨论】:

感谢您的回复,dict 对象随着时间的推移不断增长,每当我离线时,我想将 dicts 转储到文件中,一旦我在线,我想发送到服务器 当您需要更新它时,只需再次打开文件,读取文件以便从中获得list,附加到列表,使用json.dumps(list) 将列表转换为json 并写入它到一个文件。 我一直读错了,没有将列表更改回 json,现在我使用 json.loads 将文件读回列表并附加新的字典,然后使用 json.dumps 回写,最后当我需要传递字典,我只是用 json.loads 读取整个文件并发送它,您的解决方案效果很好,谢谢@Nether【参考方案2】:

使用json进行数据序列化。

import json
import collections

d = collections.OrderedDict([('a', 1), ('b', 2), ('c', 3)])

s = json.dumps(list(d.items()))
print(s)

value = json.loads(s)
print(value)

json 将对象序列化为字符串'[["a", 1], ["b", 2], ["c", 3]]'。然后json可以将数据读回python对象。

json 非常常见,被多种语言使用。大多数 web api 使用 json 来帮助他们的应用程序 RESTful。

【讨论】:

感谢您的回复,字典会随着时间的推移不断增长,每次获取字典对象时我都需要追加文件,请建议您是否有其他选择 我得看一些代码。如果您有多个字典,则调用 dict.update(other_dict) 这将合并字典。

以上是关于如何将 OrderedDicts 写入文件并将其读回列表?的主要内容,如果未能解决你的问题,请参考以下文章

将 PCM 录制的数据写入 .wav 文件(java android)

从 QTableView 读取和写入文件

Mcrypt 库将结果写入文件

如何将任意 Ruby 对象保存到磁盘并在必要时将其读回? [关闭]

从文件中写入和读取列表

IBM Worklight 6.0 - 如何将日志写入文件并将它们发回?