我尝试从python词典数据类型生成JSON文件。
以下是在将其转储为Json格式之前涉及此问题的python代码段:
channelSeg = {}
channelSeg["ch"] = None
channelSeg["chdata"] = []
for e in channelPkg:
print e
attr = e.split(':')
if attr[0] == "ch":
channel = attr[1].split(',')
channelSeg["ch"] = int(channel[0])
我这样做初始化字典索引然后我可以在我的for循环中添加更多数据,如下所示:
channelSeg["ch"] = None
channelSeg["chdata"] = []
但我真的想做的是没有为他们分配任何数据
channelSeg["ch"]
channelSeg["chdata"]
但是python不喜欢我这样做。
所以在转储操作之后,我得到了像这样的重复Json数据(部分)
"datapkg": [
{
"dataseg": [
{
"ch": 0,
"chdata": [
{
"euler": {
"y": "-19.32",
"x": "93.84",
"z": "-134.14"
}
},
{
"areal": {
"y": "57",
"x": "-242",
"z": "-210"
}
}
]
},
{
"ch": 1,
"chdata": [
{
"areal": {
"y": "-63",
"x": "-30",
"z": "10"
}
}
]
},
{
"ch": null,
"chdata": []
}
],
"t": "174464",
"n": "9884"
},
我总是多余的:
{
"ch": null,
"chdata": []
}
这使得这个JSON数据包不够健康,无论如何都要删除这段冗余数据?
非常感谢任何建议
=========== V2 ==============
在我考虑到爱德华的答案之后,我发现我只能用channelSeg解决它[“ch”] =无但我不知道如何处理另一个冗余列表,这是因为我没有发布足够的代码,所以我在这里通过了更完整的代码,并且仍在寻找解决方案.. 修改后的代码: for elem in sensorPkg:
channelPkg = elem.split('&') # channelPkg contain each channel's reading
# each channel need a dictonary to store data
channelSeg = {}
# channelSeg["ch"] = None
channelSeg["chdata"] = []
for e in channelPkg:
attr = e.split(':')
if attr[0] == "ch":
new_channel = {
'ch': int((attr[1].split(','))[0])
#channelSeg["ch"] = int(channel[0])
}
channelSeg["chdata"].append(new_channel)
# store channel numbers
elif attr[0] == "euler":
# create euler package
numbers = attr[1].split(',')
eulerSeg = {}
d = {}
d["x"] = numbers[0]
d["y"] = numbers[1]
d["z"] = numbers[2]
eulerSeg["euler"] = d
# append to channel segement
channelSeg["chdata"].append(eulerSeg)
elif attr[0] == "areal": # real accelrometer readings
# create areal package
numbers = attr[1].split(',')
arealSeg = {}
d = {}
d["x"] = numbers[0]
d["y"] = numbers[1]
d["z"] = numbers[2]
arealSeg["areal"] = d
# append to channel segement
channelSeg["chdata"].append(arealSeg)
#and so on
这是结果
{
"dataseg": [
{
"chdata": [
{
"ch": 0
},
{
"euler": {
"y": "6.51",
"x": "73.16",
"z": "-133.69"
}
},
{
"areal": {
"y": "516",
"x": "-330",
"z": "-7"
}
}
]
},
{
"chdata": [
{
"ch": 1
},
{
"euler": {
"y": "24.86",
"x": "4.30",
"z": "-71.39"
}
},
{
"areal": {
"y": "120",
"x": "316",
"z": "273"
}
}
]
},
{
"chdata": [
{
"ch": 2
},
{
"euler": {
"y": "62.32",
"x": "-60.34",
"z": "-120.82"
}
},
{
"areal": {
"y": "440",
"x": "-611",
"z": "816"
}
}
]
},
{
"chdata": []
}
],
"t": "14275",
"n": "794"
},
哪个
{
"chdata": []
}
还在那里
答案 0 :(得分:2)
在您正在使用的数据结构中,我注意到' dataseg'是一个频道列表。现在,在将每个频道添加到数据集之前,您不需要初始化每个频道。首先将数据集初始化为空列表,然后在迭代channelPkg中的条目时,可以使用从channelPkg读取的信息创建新的通道序列,并立即附加它们:
dataseg = []
for e in channelPkg:
attr = e.split(':')
if attr[0] == "ch":
new_channel = {
'ch': int(attr[1].split(',')),
'data': []
}
dataseg.append(new_channel)
希望有所帮助 - 我不确定您问题的背景是什么,所以请注意,如果这不能解决您的问题。
修改强>
我认为你的问题是最后一个channelPkg
是空的。因此,for e in channelPkg:
等同于for e in []
,因此,外部循环的最后一次迭代仅附加初始化值(for e in channelPkg
内的任何内容都不会执行)。
尝试添加两行来测试sensorPkg
是否具有ch
属性(我假设所有有效sensorPkg
都具有ch
属性):
for elem in sensorPkg:
channelPkg = elem.split('&')
# Add this to prevent appending an empty channel
if 'ch' not in [e.split(':')[0] for e in channelPkg]:
break
channelSeg = {}
channelSeg["chdata"] = []
for e in channelPkg:
# ... etc
答案 1 :(得分:0)
尝试使用条件字典理解:
channelSeg["chdata"] = {ch.split(',')[0] if ch for ch in e.split(':')}