#python #json
#python #json
Вопрос:
Итак, я работаю над проектом, в котором я должен проанализировать файл json и извлечь точки из файла json. Я пытаюсь разделить координаты x и y, а затем добавить их в список, как вы можете видеть ниже:
import json
import os
with open('annotations/20200205-095430-938.json') as json_file:
m1 = json.load(json_file)
shape = m1["shapes"]
points = shape[0]["points"]
print(points)
xs = []
ys = []
for i,j in points:
xs.append(i)
ys.append(j)
Вывод этого файла:
[[70.29729729729729, 342.7027027027027], [64.35135135135135, 351.35135135135135], [68.67567567567568, 359.4594594594594], [75.16216216216216, 348.10810810810807], [82.1891891891892, 348.10810810810807], [87.05405405405403, 336.7567567567567], [87.05405405405403, 326.48648648648646], [77.86486486486484, 320.0], [67.05405405405403, 321.6216216216216], [58.40540540540539, 333.5135135135135], [59.486486486486484, 342.16216216216213]]
Но файл json выглядит следующим образом:
{
"version": "4.5.6",
"flags": {},
"shapes": [
{
"label": "anchor",
"points": [
[
70.29729729729729,
342.7027027027027
],
[
64.35135135135135,
351.35135135135135
],
[
68.67567567567568,
359.4594594594594
],
[
75.16216216216216,
348.10810810810807
],
[
82.1891891891892,
348.10810810810807
],
[
87.05405405405403,
336.7567567567567
],
[
87.05405405405403,
326.48648648648646
],
[
77.86486486486484,
320.0
],
[
67.05405405405403,
321.6216216216216
],
[
58.40540540540539,
333.5135135135135
],
[
59.486486486486484,
342.16216216216213
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "anchor",
"points": [
[
35.70270270270271,
18.37837837837838
],
[
60.56756756756755,
15.675675675675675
],
[
70.29729729729729,
32.43243243243243
],
[
59.486486486486484,
49.729729729729726
],
[
38.40540540540539,
49.729729729729726
],
[
30.29729729729729,
37.2972972972973
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "anchor",
"points": [
[
244.35135135135135,
168.64864864864865
],
[
250.2972972972973,
183.78378378378378
]
],
"group_id": null,
"shape_type": "circle",
"flags": {}
}
],
"imagePath": "..\jpg_images\20200205-095430-938.jpg",
}
Как вы можете видеть, этот скрипт возвращает не все точки, присутствующие в файле json. Я не уверен, что я делаю здесь неправильно. Я был бы действительно признателен за вашу помощь.
Я должен спросить еще об одной вещи. У меня есть 128 файлов json с такой же структурой, как показано выше. Есть ли способ объединить все эти файлы, а затем извлечь координаты x и y из одного объединенного файла json?
С уважением, Yash Runwal.
Ответ №1:
ваш код содержит это:
points = shape[0]["points"]
это приводит к тому, что вы печатаете точки только в первой фигуре (т. е. нулевой фигуре), в то время как в файле json есть еще много фигур.
вы могли бы перебирать все фигуры в вашем json, т.Е.:
shapes = m1["shapes"]
for shape in shapes:
print(shape["points"])
(Я переименовал некоторые переменные, чтобы сделать их более удобочитаемыми.)
Для ранжирования по ряду файлов вы можете использовать модуль glob; например.: если все входные файлы имеют имена *.json:
import glob
import json
json_files = glob.glob('./*.json')
all_shapes = list()
for json_file in json_files:
with open(json_file, 'r') as infile:
print("Processing {}".format(json_file))
m1 = json.load(infile)
for shape in m1["shapes"]:
all_shapes.append(shape["points"])
print(all_shapes)
Комментарии:
1. Спасибо за ответ. Когда я пытаюсь использовать ваш код, я получаю следующую ошибку: ‘AttributeError: объект ‘str’ не имеет атрибута ‘read». Он находится после строки m1 = json.load(json_file)