#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 с использованием сглаженного 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 (не уверен, каков ваш желаемый результат, так как вы не указали желаемый результат в своем вопросе).
Комментарии:
1. Как я могу это сделать, если у меня есть сглаженный json?
2. Добавлено обновление с использованием сглаженного JSON. Не уверен, что это то, что вы имеете в виду, так как вы не предоставили пример CSV желаемого результата.
3. да, через панд это сработало. Однако с помощью традиционного письма это не работает. Спасибо вам за вашу помощь