将python输出格式化为json

将python输出格式化为json,python,json,dictionary,Python,Json,Dictionary,我编写了一个Python脚本,它以Json格式输出一个长数据结构(我称之为“celldict”的字典)。以下是其中的一小部分: { "1224": { "OUT3FA_5": 12, "IN1": 37, "Total_IN1": 37 }, "1225": { "OUT3FA_5": 24, "IN1": 59, "Total_IN1": 22 } } 但我想做的是

我编写了一个Python脚本,它以Json格式输出一个长数据结构(我称之为“celldict”的字典)。以下是其中的一小部分:

{
    "1224": {
        "OUT3FA_5": 12,
        "IN1": 37,
        "Total_IN1": 37
    },
    "1225": {
        "OUT3FA_5": 24,
        "IN1": 59,
        "Total_IN1": 22
    }
}
但我想做的是这样:

{
    "success": true,
    "data": [
        {
            "Week":"1224",
            "OUT3FA_5": 65,
            "IN1": 85,
            "Total_IN1": 100
        },
        {
            "Week":"1225",
            "OUT3FA_5": 30,
            "IN1": 40,
            "Total_IN1": 120
        }
    ]
}
有没有一种方法可以用Python格式化json输出以获得我想要的? 我有:

获取我的输出。
任何帮助都将不胜感激。

只要将
celldict
放入另一个dict中即可:

json.dumps({'success': True, 'data': celldict.values()})
您必须首先将
Week
键添加到
celldict
字典中:

for d in celldict.itervalues():
    celldict['Week'] = '1238'
或者使用“动态创建每个dict的副本”:

json.dumps({'success': True, 'data': [dict(d, Week='1238') for d in celldict.values()]})
后一种方法带有一些缩进,产生:

>>> print json.dumps({'success': True, 'data': [dict(d, Week='1238') for d in celldict.values()]}, indent=4)
{
    "data": [
        {
            "OUT3FA_5": 24, 
            "Week": "1238", 
            "Total_IN1": 22, 
            "IN1": 59
        }, 
        {
            "OUT3FA_5": 12, 
            "Week": "1238", 
            "Total_IN1": 37, 
            "IN1": 37
        }
    ], 
    "success": true
}
从字里行间看,似乎输入示例中的
1224
1225
键实际上就是您所指的周数。如果是这样,它们很容易合并:

json.dumps({'success': True, 'data': [dict(d, Week=k) for k, d in celldict.iteritems()]})
将产生:

{
    "data": [
        {
            "OUT3FA_5": 24, 
            "Week": "1225", 
            "Total_IN1": 22, 
            "IN1": 59
        }, 
        {
            "OUT3FA_5": 12, 
            "Week": "1224", 
            "Total_IN1": 37, 
            "IN1": 37
        }
    ], 
    "success": true
}

json模块遵循数据的结构,因此要获得所需的输出,必须重新排列数据。您可以这样构造一个新词典:

data = []
for week, values in celldict.iteritems():
  v2 = copy.copy(values)
  v2['week'] = week
  data.push(v2)
newdict = { 'success' : true,
            'data' : data }
json.dumps(newdict)

(免责声明:我没有测试这段代码,但它至少应该给你一个基本的想法)

谢谢!那么我想添加的“Week”字符串呢?您知道我需要的是在我的dict的每个键(由数字值1224和1225表示)之前放置
“Week”
。@user1734229:您可以通过更新
celldict
中的字典来添加它们,对吗?是的,这太棒了!但在我接受你的回答之前,我看到你已经把1238放在了一周内,而我想每周都拿到(假设我有很多周),我如何才能访问dict的密钥并将它们分配给
week=
?@user1734229:周数基于什么?你怎么确定呢?我硬编码了该值,因为您没有提供有关如何确定该数字的任何信息。如果有规则的话,为每个条目设置不同的数字是很容易的。这个结构实际上来自一个Excel文件,我使用
xlrd
库对它进行迭代,我的第一列包含所有的星期,第二列包含其他数据。我要做的是计算每一周的值,“IN1”“OUT3FA_5”出现的次数(基本上就是求和)。这就是我的第一个结构。我这样做:
celldict[first\u column\u cell][second\u column\u cell]+=1
data = []
for week, values in celldict.iteritems():
  v2 = copy.copy(values)
  v2['week'] = week
  data.push(v2)
newdict = { 'success' : true,
            'data' : data }
json.dumps(newdict)