2015-04-21 3 views
0

Я очень новичок в Python и пытаюсь использовать его с помощью соединителя API Tableau Extract для формирования таблиц (.tde). Раздражающе продолжаю получать сообщение об ошибке выше при попытке доступа к данным в API при заполнении строк таблицы. Может ли кто-нибудь из вас умных людей помочь мне?Строковые индексы должны быть целыми числами - Tableau JSON Integration

import dataextract as tde 
import os 
import urllib2 
import json 

region = "euw" 
urlPrefix = 'https://global.api.pvp.net' 
apiLink = "/api/lol/static-data/" + region + "/v1.2/champion?champData=all&api_key=" 
apiKey = "my_api_key" 
json_obj = urllib2.urlopen(urlPrefix + apiLink + apiKey) 

#Step 0: Load the JSON Object 
data = json.load(json_obj) 

#Step1: Create the extract file 
if os.path.isfile("Static" + "_" + "Champions" + "_" + "v1.2" + "_" + str.upper(region) + ".tde"): 
os.remove("Static" + "_" + "Champions" + "_" + "v1.2" + "_" + str.upper(region) + ".tde") 
tdefile = tde.Extract("Static" + "_" + "Champions" + "_" + "v1.2" + "_" + str.upper(region) + ".tde") 

#Step2: Create table definition 
tableDef = tde.TableDefinition() 
tableDef.addColumn("Name", tde.Type.CHAR_STRING) 
tableDef.addColumn("Title", tde.Type.CHAR_STRING) 
tableDef.addColumn("Skins", tde.Type.CHAR_STRING) 
tableDef.addColumn("Blurb", tde.Type.CHAR_STRING) 
tableDef.addColumn("Resource Type", tde.Type.CHAR_STRING) 
tableDef.addColumn("Primary Stats", tde.Type.DOUBLE) 
tableDef.addColumn("Secondary Stats", tde.Type.DOUBLE) 

#Step3: Create the table in the image of the table definition 
table = tdefile.addTable("Extract", tableDef) 

#Step4: Populate the table with data and create rows 
newRow = tde.Row(tableDef) 

for item in data["data"]: 
newRow.setCharString(0, item["name"]) 
newRow.setCharString(1, item["title"]) 
newRow.setCharString(2, item["skins"]) 
newRow.setCharString(3, item["blurb"]) 
newRow.setCharString(4, item["partype"]) 
newRow.setDouble(5, item["info"]) 
newRow.setDouble(6, item["stats"]) 
table.insert(newRow) 

#Step 5: CLose the TDE 
tdefile.close() 

Сообщение об ошибке является:

Traceback (most recent call last): 
    File "C:\Users\Stef\workspace\Tableau_Extract_API\Tableau_Extract_API\static_api_champions.py", line 42, in <module> 
    newRow.setCharString(0, item["name"]) 
TypeError: string indices must be integers 

Пример данных:

{"type":"champion","version":"5.7.2","data":{"Thresh":{"id":412,"key":"Thresh","name":"Thresh","title":"the Chain Warden","skins":[{"id":412000,"name":"default","num":0},{"id":412001,"name":"Deep Terror Thresh","num":1},{"id":412002,"name":"Championship Thresh","num":2},{"id":412003,"name":"Blood Moon Thresh","num":3}],"blurb":"Thresh is a sadistic, spectral reaper who relishes tormenting the living and the dead. Once a jailer who mercilessly brutalized all under his charge, Thresh was hanged from his own chains by the prisoners he had tortured. With his vicious essence ...","partype":"Mana"} 
+0

Как выглядят данные dict? –

+0

Просто добавил пример набора данных из первой записи - никогда бы не догадался, что я игрок в лиге ;-) Приветствия! – StefA

+0

Ошибка журнала не соответствует вашему коду –

ответ

2

как вы цикл над Словаре не прав

for item in data["data"]: 

Если цикл, как это , каждая итерация item будет представлять только ключ диктата. Например:

>>> for item in {'a':1, 'b':2}: 
... print item 
... 
a 
b 

Чтобы получить требуемую функциональность, вы должны петли над ДИКТ-х .iteritems(), который возвращает кортежи пар (ключ, значение).

for k, v in data["data"].iteritems(): 
    # k is now "Thresh" 
    # v is now the dict that belongs to key "Thresh" 

Это еще не совсем то, что вам нужно, я полагаю, но ниже код должен это исправить

for champion, info_dict in data["data"].iteritems(): 
    for property_key, property_value in info_dict.iteritems(): 
    print property_value 

выходы:

Thresh 
the Chain Warden 
Mana 
[{u'num': 0, u'id': 412000, u'name': u'default'}, {u'num': 1, u'id': 412001, u'name': u'Deep Terror Thresh'}, {u'num': 2, u'id': 412002, u'name': u'Championship Thresh'}, {u'num': 3, u'id': 412003, u'name': u'Blood Moon Thresh'}] 
Thresh 
412 
Thresh is a sadistic, spectral reaper who relishes tormenting the living and the dead. Once a jailer who mercilessly brutalized all under his charge, Thresh was hanged from his own chains by the prisoners he had tortured. With his vicious essence ... 

Чтобы получить имя для каждого из шкур, использование

for champion, info_dict in data["data"].iteritems(): 
    for property_key, property_value in info_dict.iteritems(): 
    if property_key == "skins": 
     print [x["name"] for x in property_value] 
+0

Большое спасибо за помощь Тим! Следующим для меня будет разработка того, как адресовать 4-ю строку вашего вывода там, чтобы получить только данные «имени» (например, «Deep Terror Thresh»). Будет ли это еще хуже? – StefA

+0

@StefA Я только что добавил, как это сделать –

+0

Ваш сэр - джентльмен и ученый! Спасибо за помощь! – StefA

Смежные вопросы