Python 连续写入包含数组的JSON文件
我想用Python创建一个JSON文件。JSON结构如下所示:Python 连续写入包含数组的JSON文件,python,json,Python,Json,我想用Python创建一个JSON文件。JSON结构如下所示: { "index_pattern" : "all_packets" "packets" : [ { "packet_type" : "TCP" "source_ip" : "192.168.0.2", "destination_ip" : "192.168.0.114" }, {
{
"index_pattern" : "all_packets"
"packets" : [
{
"packet_type" : "TCP"
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
},
{
"packet_type" : "ICMP"
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
}
]
}
每当我用wireshark模块捕获一个数据包时,我都想将该数据包添加到myoutput.json文件中。问题是,使用
f = open("myoutput.json", "a")
f.write({
"packet_type" : "ICMP"
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
})
是不合适的,因为我没有一个优雅的关闭,我不能添加必要的结束语来完成JSON。所以我需要在数据包数组之间写入。实现这一目标的最佳方式是什么 写入文件时:
import json
with open('myoutput.json', 'a') as fo:
json.dump({
"packet_type" : "ICMP",
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
}, fo)
读取文件时,请执行以下操作:
with open('myoutput.json') as fo:
data = fo.read()
data = data.replace('}{', '},{')
data = '[' + data + ']'
data = json.loads(data)
result = {"index_pattern" : "all_packets",
"packets": data}
编辑
您还可以创建一个帮助器类来执行此操作:
import json
class WriteObject:
def __init__(self, fname='myoutput.json'):
self.fname = fname
def push(self, data):
# data_example={
# "packet_type" : "ICMP",
# "source_ip" : "192.168.0.2",
# "destination_ip" : "192.168.0.114"
# }
with open(self.fname, 'a') as fo:
json.dump(data, fo)
def get_all(self):
with open(self.fname) as fo:
data = fo.read()
data = data.replace('}{', '},{')
data = '[' + data + ']'
data = json.loads(data)
result = {"index_pattern" : "all_packets",
"packets": data}
return result
# usage
obj = WriteObject()
obj.push({
"packet_type" : "ICMP",
"source_ip" : "192.168.0.2",
"destination_ip" : "192.168.0.114"
})
一种可能的解决方案是
json。将整个文件加载到python对象中,比如data
,然后将数据包添加到数据[“数据包”]
。然后您需要将更新的数据写回json文件。
这种方法的缺点是需要不断地将数据读写到json文件中
它可以通过聚合数据包列表(这样您可以临时将数据包保存到packets
list)并仅在json文件达到某个预定义大小时(例如,当len(packets)==20
时)更新json文件来改进。之后,您可以清空数据包
并再次开始收集数据。但您是否确实检查了代码是否正常工作?@taras,是的,在Jupyter!嗨,谢谢你的回答。更清楚地说,我想在文件中的packets字段中做一个push操作。为了演示它的相似之处,myoutput.json[“packets”].push({“packet_type”:“ICMP”,“source_ip”:“192.168.0.2”,“destination_ip”:“192.168.0.114”})解决方案和类实现解决了它。多亏了你们大家,你们能把这个存储在NoSQL数据库中,然后把数据包发送给那个数据库吗?嗨,谢谢你们的关注。我的项目需求是创建一个JSON文件作为另一个程序(比如X)可以读取的输出。程序X已经使用了ElasticSearch,所以我们可能不会在项目中使用其他存储工具。这就是为什么我猜不出来。@doctorlove医生