python для цикла, дающего объект «список ошибок», не вызывается

#python #for-loop

Вопрос:

У меня есть следующий фрагмент кода python, который должен получить доступ к файлу JSON, хранящемуся в корзине s3, извлечь организации для каждого объекта JSON и затем поместить их в список. for Затем существует цикл, который должен пройти по списку и применить название организации к концу /bitgear/IO-Air , чтобы создать соответствующую тему интернета вещей.

 for uuid_index, uuid in enumerate(uuid_list):
    s3 = boto3.resource('s3')
    client = boto3.client('s3')
    bucket = '3deo-sensor-data'
    key = 'simulated/config/IoT-sim-config.json'
    obj = s3.Object(bucket, key)
    data = obj.get()['Body'].read().decode('utf-8')
    json_data = json.loads(data)
    dframe = pd.DataFrame(json_data, columns= ['organisation'])
    org = dframe.values.tolist()
    
for orgs in org():
    TOPIC = org[orgs]   '/bitgear/IO-Air'
 

Однако я получаю ошибку 'list' object is not callable

Вот фрагмент того, как выглядит файл JSON:

 [    
    {
        "uuid": "1597c163-6fbf-4f46-8ff6-1e9eb4f07e34",
        "organisation": "port_36",
        "device_vendor": "bitgear",
        "device_type": "IO-Air",
        "client_id": "AQ_2"
    },
    {
        "uuid": "cde2107e-8736-47de-9e87-2033c3063589",
        "organisation": "hchjffsd2immvavb7jiqtedp",
        "device_vendor": "bitgear",
        "device_type": "IO-Air",
        "client_id": "IoT_Sim_1"
    }
]
 

Может ли кто-нибудь посоветовать, как лучше всего сформировать желаемую тему интернета вещей, используя название организации?

Комментарии:

1. Это просто потому , что вы используете org() , org-это список, который невозможно вызвать. Поэтому вы не можете использовать () .

Ответ №1:

Для этого вам не нужно использовать панду, json.loads() десериализует строку в объект Python. Поэтому загруженный json становится списком словарей, поэтому вы можете использовать:

 import json 

topics = []
for uuid_index, uuid in enumerate(uuid_list):
    s3 = boto3.resource('s3')
    client = boto3.client('s3')
    bucket = '3deo-sensor-data'
    key = 'simulated/config/IoT-sim-config.json'
    obj = s3.Object(bucket, key)
    data = obj.get()['Body'].read().decode('utf-8')
    json_data = json.loads(data)
    for data in json_data:
        topics.append(data["organisation"]   '/bitgear/IO-Air')
 

Какие листья topics содержат:

 ['port_36/bitgear/IO-Air', 'hchjffsd2immvavb7jiqtedp/bitgear/IO-Air']
 

Затем вы можете просмотреть каждую из тем в списке тем.

Ответ №2:

Измените эту часть вашего кода:

 for orgs in org:
    TOPIC = orgs   '/bitgear/IO-Air'
 

Ответ №3:

Глядя на ваш код, я думаю, что гораздо более чистым кодом было бы сначала преобразовать весь ваш json в фрейм данных со всеми столбцами, используя:

 df = pd.DataFrame.from_records(json_data)
 

Это даст вам фрейм данных со всеми необходимыми полями, а затем вы можете просто добавить строку ко всем значениям столбца «организация», как показано ниже:

 df['organisation'] = df['col'].astype(str)   '/bitgear/IO-Air'
 

Чтобы получить значения этого столбца в виде списка, вы можете просто использовать .функция tolist, как показано ниже:

 df['organisation'].tolist()
 

Ответ №4:

 for uuid_index, uuid in list(enumerate(uuid_list)):
 

попробуйте сделать это в первой строке вашего фрагмента кода. Это создаст объект списка элементов с двумя элементами-индексом и идентификатором uuid, который, похоже, является тем, что вы пытаетесь сделать.

Ответ №5:

Прежде всего org = dframe.values.tolist() возвращает список, к которому вы можете выполнять итерацию, но не вызывать его с помощью () . Итак, for цикл должен быть for orgs in org: .

Еще одна вещь, которую я заметил, заключается в следующем:

 for orgs in org():
    TOPIC = org[orgs]   '/bitgear/IO-Air'
 

При повторении списка вы получаете значения напрямую, а не индексы, поэтому org[orgs] в вашем случае вы не можете этого сделать, orgs-это элемент в самом списке.

С другой стороны, если вы хотите, вы можете сделать for idx, value in enumerate(org):