{
"resources":{
"har":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/har",
"screenshot":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot",
"video":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/video",
"filmstrip":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip",
"report_pdf":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf",
"report_pdf_full":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1",
"pagespeed":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed",
"pagespeed_files":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files",
"yslow":"https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow"
},
"error":"",
"results":{
"report_url":"https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf",
"html_load_time":"87",
"html_bytes":"3395",
"page_load_time":"522",
"page_bytes":"89229",
"page_elements":"16",
"pagespeed_score":"95",
"yslow_score":"98"
},
"state":"completed"
}
我想将嵌套的json转换为csv文件。 我正在从Rest API接收json。 csv中的字段应如下所示。 resources.har,resources.screenshot,results.report_url等 我是Python和JSON的新手,所以希望获得一些帮助
答案 0 :(得分:1)
您可以使用json_normalize
将数据作为DataFrame
加载到熊猫中,然后df.to_csv
会将文件另存为csv。
import pandas as pd
from pandas.io.json import json_normalize
data = {
'resources': {'har': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/har', 'screenshot': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot', 'video': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/video', 'filmstrip': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip', 'report_pdf': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf', 'report_pdf_full': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1', 'pagespeed': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed', 'pagespeed_files': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files', 'yslow': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow'},
'error': '',
'results': {'report_url': 'https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf', 'html_load_time': '87', 'html_bytes': '3395', 'page_load_time': '522', 'page_bytes': '89229', 'page_elements': '16', 'pagespeed_score': '95', 'yslow_score': '98'},
'state': 'completed'
}
json_normalize(data, sep='_').to_csv("filename.csv")
csv文件的内容如下:
,error,state,resources_har,resources_screenshot,resources_video,resources_filmstrip,resources_report_pdf,resources_report_pdf_full,resources_pagespeed,resources_pagespeed_files,resources_yslow,results_report_url,results_html_load_time,results_html_bytes,results_page_load_time,results_page_bytes,results_page_elements,results_pagespeed_score,results_yslow_score
0,,completed,https://gtmetrix.com/api/0.1/test/TtGJTbkv/har,https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot,https://gtmetrix.com/api/0.1/test/TtGJTbkv/video,https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip,https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf,https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1,https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed,https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files,https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow,https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf,87,3395,522,89229,16,95,98
如果您不想使用熊猫,可以手工编写转换并使用csv
模块:
import csv
data = {
'resources': {'har': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/har', 'screenshot': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/screenshot', 'video': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/video', 'filmstrip': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/filmstrip', 'report_pdf': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf', 'report_pdf_full': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/report-pdf?full=1', 'pagespeed': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed', 'pagespeed_files': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/pagespeed-files', 'yslow': 'https://gtmetrix.com/api/0.1/test/TtGJTbkv/yslow'},
'error': '',
'results': {'report_url': 'https://gtmetrix.com/reports/gtmetrix.com/Cz0AQOjf', 'html_load_time': '87', 'html_bytes': '3395', 'page_load_time': '522', 'page_bytes': '89229', 'page_elements': '16', 'pagespeed_score': '95', 'yslow_score': '98'},
'state': 'completed'
}
data_out = {}
for k, v in data.items():
if isinstance(v, dict):
for ik, iv in v.items():
data_out[f'{k}_{ik}'] = iv
else:
data_out[k] = iv
with open("filename.txt", 'w') as f:
writer = csv.DictWriter(f, fieldnames=list(data_out))
writer.writeheader()
writer.writerow(data_out)
答案 1 :(得分:0)
最简单的解决方案是pandas json包。
假设您有sample_json_df
。所需要做的只是:
from pandas.io.json import json_normalize
result = json_normalize(sample_json_df)
result.head()
给出所需的输出。