2016-06-05 2 views
1

Использование API я получаю словарь JSon в ответ в виде:Iterate словарь питона, чтобы присвоить значение полям таблицы

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

Ищу для создания записей в таблице, имеющие одни и те же соответствующие поля, как в json response: 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 

, но я застрял там. ТИА

+0

вы хотите, чтобы написать эти поля в БД? – MaxU

+1

Каков ожидаемый результат? Печатная таблица, где ваши поля отображаются в столбцах и одна строка за запись? –

+0

Я думаю, что цель состоит в том, чтобы знать, как итерации, что будет выводиться - это деталь, которую он будет реализовывать самостоятельно (в моем понимании). Ср например, мой ответ на наличие ключей полей и значений, доступных в цикле. – Dilettant

ответ

1

С помощью только модуля json из стандартной библиотеки вы c итерация над ними сортируются по именам полей в «строке» легко выглядеть примерно так:

#! /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 

Update в эскиз, как можно было бы подтолкнуть эти значения в вызове INSERT:

# 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 будет функция определяется следующим образом (пример):

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 
+0

Благодарим вас за ответ. Мне действительно нужно назначить эти значения для полей в моей базе данных. что-то вроде 'ВСТАВИТЬ (поле1, field2, field3)' , а затем на следующей итерации опять тот же 'ВСТАВИТЬ (field1, field2, field3)' – ygol

+0

Я обновил ответ, чтобы дать представление о том, как можно подключите функцию, а затем (после проверки входных значений) выполните реальную подготовленную вставку или тому подобное. Надеюсь, поможет. – Dilettant

2
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']) 

df 
Out[11]: 
     field1  field2  field3 
0 6933434802 323499903 293483842 
1 693433448 333400300 298334300 

итерируем dataframe:

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 «s:

[(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)] 
+1

Зачем вам импортировать 'pandas' только для обработки этого простого случая? – Nicarus

+0

@ Никарус почему нет? – MaThMaX

+1

Мое желание дать простой ответ было вызвано этим использованием ответа панды, но, с другой стороны, я просто забыл, когда в своей жизни я научился не делать все на атомном лавеле. Настолько хорошо иметь это неявно тяжелое решение бок о бок с другими более явными стандартными решениями. Кажется, что ОП просто хочет узнать, как перебирать гетерогенные структуры в питоне в качестве новичка, и, следовательно, я думаю, что другие ответы более освещаются на этом пути. Ваш пробег может отличаться. – Dilettant

0

, что я understad, вы просто итерировать 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} 

Тогда вы можете отправить его туда, куда вы хотите

0

Я полагаю resp_json уже есть dict.

Таким образом, чтобы получить доступ к списку полей dict с, вы бы сослаться на него с помощью ключа, а не индекс:

resp_json['transacDet'] обеспечивает:

[{"field1":6933434802,"field2":323499903,"field3":293483842}, {"field1":693433448,"field2":333400300,"field3":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 
+0

Я думаю, что это список dicts, где ключи в этих dicts являются искомыми именами полей, указанный выше доступ к 'values ​​['field1']' не будет работать. – Dilettant

+0

Не уверен, что я последую вашему комментарию. Это действительно работает - не могли бы вы уточнить? – Nicarus

+0

Ах, мой плохой, попытался взглянуть на него глазами OP, и это не всегда мой лучший способ работы. ** Но ** если предположить, что OP находится только в начале обучения Python, этот шаблон доступа может на самом деле раздражать, так как выбирается только поле1, и он должен быть известен заранее (по крайней мере, в образце), поэтому в моем понимании вопрос, это особенно простой «выбрать их все» в строке/dict-решении, которое он хотел видеть. Но я могу ошибаться. Таким образом, ваш код, конечно, «работает», но имеет доступ только к значениям «filed1» для каждой строки. – Dilettant

0

Попробуйте это:

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]] 
Смежные вопросы