将json嵌套到csv

问题描述 投票:-1回答:2
{
    "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的新手,所以希望获得帮助

python json csv
2个回答
1
投票

您可以使用json_normalize将数据作为json_normalize加载到熊猫中,然后DataFrame将文件另存为csv。

df.to_csv

csv文件的内容如下:

df.to_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") 模块:

,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

0
投票

最简单的解决方案是pandas json包。假设您有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)

给出所需的输出。

© www.soinside.com 2019 - 2024. All rights reserved.