файл json не отображает все данные

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