Преобразование JSON с вложенным массивом в CSV с использованием Python

1

Вот шаблон моего JSON:

{
  "field 1": [
    {
      "id": "123456"
    },
    {
      "about": "YESH"
    },
    {
      "can_post": true
    },
    {
      "category": "Community"
    }
  ],
  "field 2": [
    {
      "id": "123456"
    },
    {
      "about": "YESH"
    },
    {
      "can_post": true
    },
    {
      "category": "Community"
    }
  ]
}

Я хотел бы преобразовать этот JSON в csv в следующем формате, используя Python:

0 field 1, id, about, can_post, category

1 field 2, id, about, can_post, category

Я попытался использовать pandas для read_json, а затем to_csv, но это не сработало.

Спасибо

  • 1
    я не понимаю, почему вы используете массив для ключа field1
Теги:
csv

3 ответа

1
Лучший ответ
import csv
import json

json.load(json_data) Deserialize json_data (json document (txt/binary file)) для объекта python.

with open('jsn.txt','r') as json_data:
    json_dict = json.load(json_data)

так как ваши имена полей (ключи, которые будут действовать как имя поля) находятся внутри разных dicts, мы должны пройти через этот dicts и поместить их в список field_names.

field_names = [ 'field']
for d in json_dict['field 1']:
    field_names.extend(d.keys())

with open('mycsvfile.csv', 'w') as f:  
    w = csv.DictWriter(f, fieldnames = fieild_names)
    w.writeheader()

    for k1, arr_v in json_dict.items():
        temp = {k2:v for d in arr_v for k2,v in d.items()}
        temp['field'] = k1
        w.writerow(temp)


Выход

field,id,about,can_post,category
field 1,123456,YESH,True,Community
field 2,123456,YESH,True,Community


Если вы обнаружите, что понимание диктата сбивает с толку

      k1  : arr_v 
'field 1' = [{ "id": "123456" },...{"category": "Community"}]

            for d in arr_v:                 
                        k2 : v
               d --> { "id": "123456" }
1

Жесткая часть здесь заключается в том, что исходная структура json - это не просто список отображений, а отображение, в котором значения, в свою очередь, представляют собой списки отображений.

IMHO, вы должны предварительно обработать свой ввод или обработать его элементом по элементу, чтобы получить список или сопоставление, которое может быть преобразовано в строку csv. Вот возможное решение, которое:

  • извлеките ключи для первого элемента и используйте их для создания DictWriter
  • построить сопоставление для каждого элемента и сохранить его в DictWriter

Код может быть:

import json
import csv

# read the json data
with open("input.json") as fd:
    data = json.load(fd)

# extract the field names (using 'field' for the key):
names = ['field']
for d in next(iter(data.values())):
    names.extend(d.keys())

# open the csv file as a DictWriter using those names
with open("output.csv", "w", newline='') as fd:
    wr = csv.DictWriter(fd, names)
    wr.writeheader()
    for field, vals in data.items():
        d['field'] = field
        for inner in vals:
            for k,v in inner.items():
                d[k] = v
        wr.writerow(d)

С вашими данными он дает:

field,id,about,can_post,category
field 1,123456,YESH,True,Community
field 2,123456,YESH,True,Community
  • 0
    Я получил следующую ошибку: "names.extend (d.key ()) AttributeError: объект 'dict' не имеет атрибута 'key'"
  • 0
    @GuyShoshan: Не уверен, что опечатка, но я написал ключ s , а не ключ, как вы сделали в своем комментарии
1

как насчет этого, если у вас есть json подобные data

data = [
   {
    "site": "field1",
    "id": "123456",
    "about": "YESH",
    "can_post": True,
    "category": "Community"
  },
  {
    "site": "field2",
    "id": "123456",
    "about": "YESH",
    "can_post": True,
    "category": "Community"
  }
]
# also use True instead of true

df = pd.DataFrame.from_dict(data)

print(df)
# use df.to_csv('filename.csv') for csv

выход:

  about  can_post   category      id    site
0  YESH      True  Community  123456  field1
1  YESH      True  Community  123456  field2
  • 0
    Это был мой результат: поле 1 поле 2 0 {u'id ': u'123456'} {u'id ': u'123456'} 1 {u'about ': u'YESH'} {u'about ': u'YESH '} 2 {u'can_post': True} {u'can_post ': True} 3 {u'category': u'Community '} {u'category': u'Community '}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню