迭代python字典以将值分配给表';s场

迭代python字典以将值分配给表';s场,python,json,dictionary,Python,Json,Dictionary,使用API,我得到一个json字典作为响应,格式如下: {"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842}, {"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus" :{"statusMessage":"success","statusCode":0}} 我希望在一个表中创建与json响应中的字段相同

使用API,我得到一个json字典作为响应,格式如下:

{"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842},
{"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus"
:{"statusMessage":"success","statusCode":0}}
我希望在一个表中创建与json响应中的字段相同的记录:field1、field2、field3

根据上述示例,我将有2条记录:

field1 = 6933434802
field2 = 333400298
field3 = 298334842
然后:

field1 = 693433448
field2 = 333400300
field3 = 298334300
我必须重复回答,但不清楚如何回答

我尝试使用:

for k in resp_json.items()[0][1][0]:
print k
但是我被困在那里了。 短暂性脑缺血发作

迭代数据帧:

for i in df.iterrows(): print i[1], '\n'
field1    6933434802
field2     323499903
field3     293483842
Name: 0, dtype: int64 

field1    693433448
field2    333400300
field3    298334300
Name: 1, dtype: int64 
因此,如果您不想使用
pandas
。只需使用生成器(列表理解),这是基于@Dilettant的解决方案:

[(k, d[k]) for d in resp_json['transacDet'] for k in sorted(d.keys())]
Out[24]: 
[(u'field1', 6933434802L),
 (u'field2', 323499903),
 (u'field3', 293483842),
 (u'field1', 693433448),
 (u'field2', 333400300),
 (u'field3', 298334300)]

据我所知,您只需迭代
transacDet
键:

import json
parsed = json.loads('{"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842}, {"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus" :{"statusMessage":"success","statusCode":0}}')

for record in parsed['transacDet']:
    print record
结果:

{u'field2': 323499903, u'field3': 293483842, u'field1': 6933434802}
{u'field2': 333400300, u'field3': 298334300, u'field1': 693433448}

然后您可以将它发送到任何您想要的地方

我假设
resp_json
已经是一个
dict

因此,要访问字段
dict
s的列表,您可以通过键而不是索引来引用它:

resp_json['transacDet']
为您提供:

[{“field1”:6933434802,“field2”:323499903,“field3”:293483842},
{“字段1”:693433448,“字段2”:333400300,“字段3”:298334300}]

然后,您可能希望迭代这些内容,如下所示:

for values in resp_json['transacDet']:
    # here you can now access the content of the current `dict`
    print 'field1 = ' + values['field1']
    # would print: "field1 = 6933434802"
    # ... and so on

仅使用标准库中的json模块,您就可以按每“行”的字段名对其进行迭代,如下所示:

#! /usr/bin/env
from __future__ import print_function
import json


JSON_TEXT = '''
{"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842},
{"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus"
:{"statusMessage":"success","statusCode":0}}'''

resp_json = json.loads(JSON_TEXT)
for d in resp_json['transacDet']:
    for k in sorted(d.keys()):
        print(k, d[k])
这将产生:

field1 6933434802
field2 323499903
field3 293483842
field1 693433448
field2 333400300
field3 298334300
更新以概述如何将这些值推入插入调用:

# inside the loop instead of iterating over the fields in the
# dict / row at hand, one could easily for instance do:
resp_json = json.loads(JSON_TEXT)
for d in resp_json['transacDet']:
    insert_row(**d)
此处,insert_row是一个定义如下的函数(示例):

试试这个:

a= {"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842},
{"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus"
:{"statusMessage":"success","statusCode":0}}

import pandas as pd

df =pd.DataFrame(a['transacDet']).T

print df[0]
print df[1]



 #  field1    6933434802
  #  field2     323499903
  #  field3     293483842
  #  Name: 0, dtype: int64

  #  field1    693433448
  #  field2    333400300
  #  field3    298334300
  #  Name: 1, dtype: int64

import json

JSON_TEXT = '''
{"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842},
{"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus"
:{"statusMessage":"success","statusCode":0}}'''

resp_json = json.loads(JSON_TEXT)


t1 = [[k,v] for k,v in  resp_json['transacDet'][0].iteritems()]
t2 = [[k,v] for k,v in  resp_json['transacDet'][1].iteritems()]      

 print (t1)
 print (t2)

   # [[u'field2', 323499903], [u'field3', 293483842], [u'field1', 6933434802]]
   # [[u'field2', 333400300], [u'field3', 298334300], [u'field1', 693433448]]

是否要将这些字段写入DB?预期的输出是什么?一个打印的表格,其中字段以列形式显示,每条记录一行?我想目的是了解如何迭代,输出的是他将自己实现的细节(据我理解)。我的答案是在一个循环中可以访问字段和值的键。谢谢你的回答。我确实需要将这些值分配给数据库中的字段。类似于'INSERT(field1,field2,field3)`的东西,然后在下一次迭代中再次使用相同的'INSERT(field1,field2,field3)`为什么要导入
pandas
来处理这个简单的案例?使用pandas答案激发了我提供简单答案的动机,但另一方面,我完全忘记了,在我的生活中,我学会了不要在原子炉上做任何事情。让这个隐含的沉重的解决方案和其他更明确的标准解决方案并排出现是件好事。OP似乎只是想作为初学者学习如何在python中迭代异构结构,因此我认为其他答案在这方面更具启发性。您的里程可能会有所不同。@Dilettant,是的,您是对的,为了学习,
pandas
不是一个好的选择,我更新了我的答案。我想这是一个目录列表,其中的键是搜索的字段名,上面访问“values['field1]”的权限将不起作用。我不确定是否听从您的评论。这确实有效-你能澄清一下吗?啊,我的错,试着从OP的角度来看,这并不总是我最好的操作方式。但是假设OP只是在学习Python的开始,这种访问模式实际上可能会让人恼火,因为只选择了field1,而且必须事先知道它(至少在示例中是这样),所以在我对这个问题的理解中,他特别想看到的是一个简单的“全部选择”每行/dict解决方案。但我可能错了。因此,您的代码当然“有效”,但每行只访问“filed1”的值。假设OP了解该模式,并且可以实现所有字段。如果目标是学习,那么盲目地给出解决方案会适得其反。谢谢你的回答。我确实需要将这些值分配给数据库中的字段。类似于'INSERT(field1,field2,field3)`然后在下一次迭代中再次使用相同的'INSERT(field1,field2,field3)`我更新了答案,给出了如何插入函数的想法,然后在那里(验证输入值后)执行真正准备好的插入或类似操作。希望能有帮助。
def insert_row(**kwargs):
    """Not production ready ;-)."""
    # pick up the row key-value pairs from dict
    list_of_tuples = [
        (k, kwargs[k] for k in sorted(kwargs.keys())]
    pass  # here you might use this list of (k, v) tuples
a= {"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842},
{"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus"
:{"statusMessage":"success","statusCode":0}}

import pandas as pd

df =pd.DataFrame(a['transacDet']).T

print df[0]
print df[1]



 #  field1    6933434802
  #  field2     323499903
  #  field3     293483842
  #  Name: 0, dtype: int64

  #  field1    693433448
  #  field2    333400300
  #  field3    298334300
  #  Name: 1, dtype: int64

import json

JSON_TEXT = '''
{"transacDet":[{"field1":6933434802,"field2":323499903,"field3":293483842},
{"field1":693433448,"field2":333400300,"field3":298334300}],"responseStatus"
:{"statusMessage":"success","statusCode":0}}'''

resp_json = json.loads(JSON_TEXT)


t1 = [[k,v] for k,v in  resp_json['transacDet'][0].iteritems()]
t2 = [[k,v] for k,v in  resp_json['transacDet'][1].iteritems()]      

 print (t1)
 print (t2)

   # [[u'field2', 323499903], [u'field3', 293483842], [u'field1', 6933434802]]
   # [[u'field2', 333400300], [u'field3', 298334300], [u'field1', 693433448]]