Не удается создать правильный csv-файл из JSON с помощью python

#python #json #jupyter-notebook

Вопрос:

Я не могу создать правильный csv-файл, используя приведенный ниже код. Но когда я запрашиваю по отдельности, я получаю желаемый результат. Ниже приведен мой файл json и код

 {
"quiz": {
    "maths": {
      "q2": {
            "question": "12 - 8 = ?",
            "options": [
                "1",
                "2",
                "3",
                "4"
            ],
            "answer": "4"
        },
        "q1": {
            "question": "5   7 = ?",
            "options": [
                "10",
                "11",
                "12",
                "13"
            ],
            "answer": "12"
        }
        
    },
    "sport": {
        "q1": {
            "question": "Which one is correct team name in NBA?",
            "options": [
                "New York Bulls",
                "Los Angeles Kings",
                "Golden State Warriros",
                "Huston Rocket"
            ],
            "answer": "Huston Rocket"
        }
    }        
}
 

}

 import json
import csv

# Opening JSON file and loading the data
# into the variable data
with open('tempjson.json', 'r') as jsonFile:
    data = json.load(jsonFile)
    flattenData=flatten(data)

employee_data=flattenData

# now we will open a file for writing
data_file = open('data_files.csv', 'w')

# create the csv writer object
csv_writer = csv.writer(data_file)

# Counter variable used for writing 
# headers to the CSV file
count = 0

for emp in employee_data:
    if count == 0:

        # Writing headers of CSV file
        header = emp
        csv_writer.writerow(header)
        count  = 1

    # Writing data of CSV file
    #csv_writer.writerow(employee_data.get(emp))

data_file.close()
 

Как только приведенный выше код будет выполнен, я получу информацию, как показано ниже:

введите описание изображения здесь

Я не понимаю, что я делаю не так. Я выравниваю свой файл json, а затем пытаюсь изменить его на csv

Комментарии:

1. Как выглядит эта flatten функция?

2. 'Huston Rocket' это неверно. Это 'Houston Rockets'

Ответ №1:

Вы можете легко манипулировать JSON с помощью фреймов данных Pandas и сохранять их в формате CSV. Я не уверен, как должен выглядеть ваш желаемый CSV, но следующий код генерирует CSV-файл со столбцами вопрос, параметры и ответы. Он генерирует столбец индекса с названием теста и номером вопроса в алфавитном порядке (ваш JSON был неупорядочен). Приведенный ниже код также будет работать, когда будут добавлены другие различные тесты и вопросы.

Возможно, преобразование его изначально в Python с точки зрения производительности лучше, но манипуляции с использованием Панд упрощают это.

 import pandas as pd

# create Pandas dataframe from JSON for easy manipulation
df = pd.read_json("tempjson.json")

# create result dataframe
df_result = pd.DataFrame()

# Get nested dict from each dataframe row
for index, row in df.iterrows():
    
    # Convert it into a new dataframe
    df_temp = pd.DataFrame.from_dict(df.loc[index]['quiz'], orient='index')
    # Add name of quiz to index
    df_temp.index = index   ' '   df_temp.index
    # Append row result to final dataframe
    df_result = df_result.append(df_temp)
    
# Optionally sort alphabetically so questions are in order
df_result.sort_index(inplace=True)

# convert dataframe to CSV
df_result.to_csv('quiz.csv')
 

CSV

Обновление по запросу: Экспорт в CSV с использованием сглаженного JSON:

 import json
import csv
from flatten_json import flatten
import pandas

# Opening JSON file and loading the data
# into the variable data
with open("tempjson.json", 'r') as jsonFile:
    data = json.load(jsonFile)
    flattenData=flatten(data)
    
    
df = pd.DataFrame.from_dict(flattenData, orient='index')    

# convert dataframe to CSV
df.to_csv('quiz.csv', header=False)    

 

Результаты в следующем формате CSV (не уверен, каков ваш желаемый результат, так как вы не указали желаемый результат в своем вопросе).

сглаженный вывод csv

Комментарии:

1. Как я могу это сделать, если у меня есть сглаженный json?

2. Добавлено обновление с использованием сглаженного JSON. Не уверен, что это то, что вы имеете в виду, так как вы не предоставили пример CSV желаемого результата.

3. да, через панд это сработало. Однако с помощью традиционного письма это не работает. Спасибо вам за вашу помощь