#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):