Как извлечь часть JSON как другую JSON и разделить их на несколько JSON файлов на Python - PullRequest
0 голосов
/ 18 апреля 2020

Я начал изучать анализ данных, используя Python. И я пытался использовать набор данных Adzuna для моего курсового проекта. Ответ на мой вызов API выглядит следующим образом:

{
  "results": [
    {
      "salary_min": 50000,
      "longitude": -0.776902,
      "location": {
        "__CLASS__": "Adzuna::API::Response::Location",
        "area": [
          "UK",
          "South East England",
          "Marlow"
        ],
        "display_name": "Marlow, Buckinghamshire"
      },
      "salary_is_predicted": 0,
      "description": "JavaScript Developer Corporate ...",
      "__CLASS__": "Adzuna::API::Response::Job",
      "created": "2013-11-08T18:07:39Z",
      "latitude": 51.571999,
      "redirect_url": "http://adzuna.co.uk/jobs/land/ad/129698749...",
      "title": "Javascript Developer",
      "category": {
        "__CLASS__": "Adzuna::API::Response::Category",
        "label": "IT Jobs",
        "tag": "it-jobs"
      },
      "id": "129698749",
      "salary_max": 55000,
      "company": {
        "__CLASS__": "Adzuna::API::Response::Company",
        "display_name": "Corporate Project Solutions"
      },
      "contract_type": "permanent"
    },
    ... another 19 samples here ...
  ],
  "mean": 43900.46, 
  "__CLASS__": "Adzuna::API::Response::JobSearchResults",
  "count": 74433
}

Моя цель состоит в том, чтобы по отдельности извлечь 20 выборок в «результатах», чтобы позже я мог создать набор данных numpy для анализа данных. Итак, я написал Python примерно так:

item_dict = json.loads(response.text)
# Since "results" start/end with [ and ], Python treats it as a list. So, I need to remove them.
string_data = str(item_dict['results']).lstrip("[")
string_data = string_data.rstrip("]")

# Convert "results" string back to JSON, then extract each sample from 20 samples
json_results_data = json.loads(string_data)
for sample in json_results_data:
  print(sample)

Однако json_results_data = json.loads(string_data) не преобразует строку "результатов" в JSON. Я новичок в Python, поэтому, возможно, я задаю глупый вопрос, но, пожалуйста, дайте мне знать, если вы можете найти простой способ исправить это. Благодаря.

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Хватит ставить квадратные скобки ... это должен быть список.

Попробуйте это

item_dict = json.loads(response.text)

for sample in item_dict["results"]:
  print(sample)

Ваша проблема заключалась в том, что вы думали, что у вас есть диктант (json), но у вас есть список диктов.

0 голосов
/ 18 апреля 2020

То, что вы пытаетесь достичь, это организовать ваши данные из объекта json. Первая строка в вашем коде item_dict = json.loads(response.text) возвращает вам объект dict, и, следовательно, вы можете просто использовать его.

Я бы показал два метода:

  1. Использование pandas.DataFrame упорядочить ваши данные.
  2. Использование a для l oop, чтобы просто распечатать ваши данные.

Но учтите, что pandas.DataFrame позволяет вам также быстро конвертировать ваши данные в массив numpy (используйте: df.to_numpy())

import pandas as pd

results = response.json['results'] # item_dict['results']
df = pd.DataFrame(results)
print(df)
# df.to_numpy()

output :

      a    b     c     d      e
0   1.0  2.0   NaN   dog   True
1  20.0  2.0   0.0   cat   True
2   1.0  NaN   NaN  bird   True
3   NaN  2.0  88.0   pig  False

Вместо этого, если вы просто хотите распечатать каждый словарь внутри results, вы можете просто сделать это:

for result in results:
    print(result)

Dummy Data

item_dict = {
    'results': [
                {'a': 1, 'b': 2, 'c': None, 'd': 'dog', 'e': True}, 
                {'a': 20, 'b': 2, 'c': 0, 'd': 'cat', 'e': True}, 
                {'a': 1, 'b': None, 'c': None, 'd': 'bird', 'e': True},
                {'a': None, 'b': 2, 'c': 88, 'd': 'pig', 'e': False}
    ],
    "mean": 43900.46, 
    "__CLASS__": "Adzuna::API::Response::JobSearchResults",
    "count": 74433
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...