gpt4 book ai didi

python - (Python) 通过重复数据删除合并新的和现有的 JSON

转载 作者:行者123 更新时间:2023-12-01 04:15:31 25 4
gpt4 key购买 nike

我正在使用 Python 查询 API,该 API 发送最后 X 个事件的 JSON,我想保留它发送给我的内容的历史记录。

这就是 API 发送的内容,我的平面历史文件中有相同类型的元素(但有更多相同的对象)。API 和我的最终文件没有用于设置字典的 key 。

[{
"Item1": "01234",
"Item2": "Company",
"Item3": "XXXXXXXXX",
"Item4": "",
"Item5": "2015-12-17T12:00:01.553",
"Item6": "2015-12-18T12:00:00"
},
{
"Item1": "01234",
"Item2": "Company2",
"Item3": "XXXXXXX",
"Item4": null,
"Item5": "2015-12-17T16:49:23.76",
"Item6": "2015-12-18T11:00:00",
}]

仅当 API 元素不在原始文件中时,如何添加这些元素?我有打开/关闭文件的框架,但对处理没有太多想法。

main_file=open("History.json","r")
new_items=[]
api_data=requests.get(#here lies the api address and the header)
#here should be the deplucation/processing process
for item in api_data
if item not in main_file
new_items.append(item)
main_file.close()
try:
file_updated = open("History.json",'w')
file_updated.write(new_items + main_file)
file_updated.close()
print("File updated")
except :
print("Error writing file")

编辑:我使用 json to object 方法来执行此操作:

from collections import namedtuple
Event = namedtuple('Event', 'Item1, Item2, Item3, Item4, Item5, Item6')
def parse_json_events(text):
events = [ Event(**k) for k in json.loads(text) ]
return events
if path.exists('Mainfile.json'):
with open('Mainfile.json') as data_file:
local_data = json.load(data_file)
print(local_data.text) #debug purposes
events_local=parse_json_events(local_data.text)
else:
events_local=[]
events_api=parse_json_events(api_request.text)
inserted_events=0
for e in events_api[::-1]:
if e not in events_local:
events_local.insert(0, e)
inserted_events=inserted_events+1
print("inserted elements %d" % inserted_events)
print(events_local) # this is OK, gives me a list of events
print(json.dump(events_local)) # this ... well... I want the list of object to be serialized but I get this error :

TypeError: dump() missing 1 required positional argument: 'fp'

最佳答案

通常,您可以通过使用/不使用第三方工具(如 Avro、Thrift 等)定义架构来解决此类问题。基本上,您从 API 获得的每条记录都需要转换为您正在使用的编程语言的实体。

让我们以这个 JSON 对象为例:

{
"Item1": "01234",
"Item2": "Company",
"Item3": "XXXXXXXXX",
"Item4": "",
"Item5": "2015-12-17T12:00:01.553",
"Item6": "2015-12-18T12:00:00"
},

如果您有类似的架构

Company(object):
company_number = ...
name = ...
# other fields

然后,您需要做的就是对原始数据进行序列化和反序列化。

理想情况下,您可以从 API 读取 JSON 响应,然后您可以简单地将每个 json 对象拆分为架构对象(使用或不使用工具)。在伪代码中:

api_client = client(http://..., )
response = api_client.get("/resources")
json = response.json
companies = parse_json_companies(json) # list of Company objects

此时,处理从 api 获取的数据真的很容易了。您应该对存储在文件系统上的文件执行相同的操作。加载文件并反序列化记录(到 Company 对象)。然后,比较对象将很容易,因为它们将像“普通”Python 对象一样,以便您可以执行比较等。

例如:

from collections import namedtuple
import json
Company = namedtuple('Company', 'Item1, Item2, Item3, Item4, Item5, Item6')
def parse_json_companies(text):
companies = [Company(**k) for k in json.loads(text)]
return companies

>>> companies = parse_json_companies(response.json)
>>> companies
[Company(Item1='01234', Item2='Company', Item3='XXXXXXXXX', Item4=u'', Item5='2015-12-17T12:00:01.553', Item6='2015-12-18T12:00:00'), Company(Item1='01234', Item2='Company2', Item3='XXXXXXX', Item4=None, Item5='2015-12-17T16:49:23.76', Item6='2015-12-18T11:00:00')]

.dump(obj, fp) 出错后更新。

如果 json.dump 出现错误,请参阅 documentation请。它明确指出 objfp 是必需参数。

Serialize obj as a JSON formatted stream to fp (a .write()-supporting file-like object) using this conversion table.

因此,您需要传递一个支持.write的对象(例如,以写入模式打开的文件)。

关于python - (Python) 通过重复数据删除合并新的和现有的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34352846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com