Объедините несколько файлов JSON и выполните синтаксический анализ в CSV

#json #csv

#json #csv

Вопрос:

У меня есть около 100 файлов JSON, все с разными датами, и мне нужно объединить их в один файл CSV с заголовками «дата», «real_name», «текст».

В самом JSON нет дат, перечисленных в JSON, а real_name является вложенным. Я давно не работал с JSON и немного растерялся.

Базовая структура JSON выглядит более или менее так:

Имя файла: 2021-01-18.json

 [
    {
        "client_msg_id": "xxxx",
        "type": "message",
        "text": "THIS IS THE TEXT I WANT TO PULL",
        "user": "XXX",
        "user_profile": {
            "first_name": "XXX",
            "real_name": "THIS IS THE NAME I WANT TO PULL",
            "display_name": "XXX",
            "is_restricted": false,
            "is_ultra_restricted": false
        },
        "blocks": [
            {
                "type": "rich_text",
                "block_id": "yf=A9",
            }
        ]
    }
]
 

До сих пор у меня

 import glob 
read_files = glob.glob("*.json")
output_list = []
all_items = []

for f in read_files:
    with open(f, "rb") as infile:
        output_list.append(json.load(infile))
    data = {}
    for obj in output_list[]
        data['date'] = f
        data['text'] = 'text'
        data['real_name'] = 'real_name'
        all_items.append(data)
 

Ответ №1:

После того, как вы прочитали объект JSON, просто индексируйте данные в словарях. Вам может понадобиться obj[0]['text'] и т. Д., Если ваши данные JSON действительно находятся в списке в каждом файле, но это кажется странным, и я предполагаю, что ваши данные были вставлены output_list после того, как вы собрали данные. Итак, предполагая, что содержимое вашего файла точно такое, как показано ниже:

 {
    "client_msg_id": "xxxx",
    "type": "message",
    "text": "THIS IS THE TEXT I WANT TO PULL",
    "user": "XXX",
    "user_profile": {
        "first_name": "XXX",
        "real_name": "THIS IS THE NAME I WANT TO PULL",
        "display_name": "XXX",
        "is_restricted": false,
        "is_ultra_restricted": false
    },
    "blocks": [
        {
            "type": "rich_text",
            "block_id": "yf=A9",
        }
    ]
}
 

test.py:

 import json
import glob 
from pathlib import Path

read_files = glob.glob("*.json")
output_list = []
all_items = []
for f in read_files:
    with open(f, "rb") as infile:
        output_list.append(json.load(infile))
    data = {}
    for obj in output_list:
        data['date'] = Path(f).stem
        data['text'] = obj['text']
        data['real_name'] = obj['user_profile']['real_name']
        all_items.append(data)
print(all_items)
 

Вывод:

 [{'date': '2021-01-18', 'text': 'THIS IS THE TEXT I WANT TO PULL', 'real_name': 'THIS IS THE NAME I WANT TO PULL'}]