解析嵌套的JSON并将其写入CSV(重访)

时间:2017-08-17 16:48:23

标签: python json python-3.x csv export-to-csv

熟悉Python,并在以下帖子中给出答案:

Parsing nested JSON and writing it to CSV

如何定义输入文件以使此代码有效?我知道我必须定义" outputfile"作为我写的路径/文件名,但我不知道输入文件应该去哪里?

编辑:为了清楚起见,我添加了一个JSON文件用于输入,并希望将其转换为CSV文件作为输出。我只想知道如何编写代码的代码(从上面开始)并让它指定一个特定的JSON文件作为输入。同样为了清楚起见,JSON文件的名称将保持不变,但内容将每天更改,因此我只需要知道将open()放在何处 以及如何在脚本中调用它。

EDIT_2:

inputfile = "/some/file.json"
outputfile = "/some/file.csv"
with open(inputfile, 'r') as inf:
    with open(outputfile, 'w') as outf:
        writer = None  # will be set to a csv.DictWriter later
            fp = open(inputfile, 'r')
            json_value = fp.read()
            data = json.loads(json_value)

        for key, item in sorted(data.items(), key=itemgetter(0)):
            row = {}
            nested_name, nested_items = '', {}
            for k, v in item.items():
                if not isinstance(v, dict):
                    row[k] = v
                else:
                    assert not nested_items, 'Only one nested structure is supported'
                    nested_name, nested_items = k, v

            if writer is None:
                # build fields for each first key of each nested item first
                fields = sorted(row)

                # sorted keys of first item in key sorted order
                nested_keys = sorted(sorted(nested_items.items(), key=itemgetter(0))[0][1])
                fields.extend('__'.join((nested_name, k)) for k in nested_keys)

                writer = csv.DictWriter(outf, fields)
                writer.writeheader()

            for nkey, nitem in sorted(nested_items.items(), key=itemgetter(0)):
                row.update(('__'.join((nested_name, k)), v) for k, v in nitem.items())
                writer.writerow(row)

我得到的错误是......

for k, v in item.items():

AttributeError:' list'对象没有属性'项目'

我想我可能没有正确阅读JSON文件...... Python新手压力源。

EDIT_3(更新的JSON结构): 这是一个条目'从我正在使用的JSON文件(NIST / NVD JSON文件):

    {
      "CVE_data_type" : "CVE",
      "CVE_data_format" : "MITRE",
      "CVE_data_version" : "4.0",
      "CVE_data_numberOfCVEs" : "6208",
      "CVE_data_timestamp" : "2017-08-14T18:06Z",
      "CVE_Items" : [ {
        "cve" : {
          "CVE_data_meta" : {
            "ID" : "CVE-2003-1547"
          },
          "affects" : {
            "vendor" : {
              "vendor_data" : [ {
                "vendor_name" : "francisco_burzi",
                "product" : {
                  "product_data" : [ {
                    "product_name" : "php-nuke",
                    "version" : {
                      "version_data" : [ {
                        "version_value" : "6.5"
                      }, {
                        "version_value" : "6.5_beta1"
                      }, {
                        "version_value" : "6.5_rc3"
                      }, {
                        "version_value" : "6.5_rc2"
                      }, {
                        "version_value" : "6.5_rc1"
                      } ]
                    }
                  } ]
                }
              } ]
            }
          },
          "problemtype" : {
            "problemtype_data" : [ {
              "description" : [ {
                "lang" : "en",
                "value" : "CWE-79"
              } ]
            } ]
          },
          "references" : {
            "reference_data" : [ {
              "url" : "http://secunia.com/advisories/8478"
            }, {
              "url" : "http://securityreason.com/securityalert/3718"
            }, {
              "url" : "http://www.securityfocus.com/archive/1/archive/1/316925/30/25250/threaded"
            }, {
              "url" : "http://www.securityfocus.com/archive/1/archive/1/317230/30/25220/threaded"
            }, {
              "url" : "http://www.securityfocus.com/bid/7248"
            }, {
              "url" : "https://exchange.xforce.ibmcloud.com/vulnerabilities/11675"
            } ]
          },
          "description" : {
            "description_data" : [ {
              "lang" : "en",
              "value" : "Cross-site scripting (XSS) vulnerability in block-Forums.php in the Splatt Forum module for PHP-Nuke 6.x allows remote attackers to inject arbitrary web script or HTML via the subject parameter."
            } ]
          }
        },
        "configurations" : {
          "CVE_data_version" : "4.0",
          "nodes" : [ {
            "operator" : "OR",
            "cpe" : [ {
              "vulnerable" : true,
              "cpeMatchString" : "cpe:/a:francisco_burzi:php-nuke:6.5",
              "cpe23Uri" : "cpe:2.3:a:francisco_burzi:php-nuke:6.5:*:*:*:*:*:*:*"
            }, {
              "vulnerable" : true,
              "cpeMatchString" : "cpe:/a:francisco_burzi:php-nuke:6.5_beta1",
              "cpe23Uri" : "cpe:2.3:a:francisco_burzi:php-nuke:6.5_beta1:*:*:*:*:*:*:*"
            }, {
              "vulnerable" : true,
              "cpeMatchString" : "cpe:/a:francisco_burzi:php-nuke:6.5_rc1",
              "cpe23Uri" : "cpe:2.3:a:francisco_burzi:php-nuke:6.5_rc1:*:*:*:*:*:*:*"
            }, {
              "vulnerable" : true,
              "cpeMatchString" : "cpe:/a:francisco_burzi:php-nuke:6.5_rc2",
              "cpe23Uri" : "cpe:2.3:a:francisco_burzi:php-nuke:6.5_rc2:*:*:*:*:*:*:*"
            }, {
              "vulnerable" : true,
              "cpeMatchString" : "cpe:/a:francisco_burzi:php-nuke:6.5_rc3",
              "cpe23Uri" : "cpe:2.3:a:francisco_burzi:php-nuke:6.5_rc3:*:*:*:*:*:*:*"
            } ]
          } ]
        },
        "impact" : {
          "baseMetricV2" : {
            "cvssV2" : {
              "vectorString" : "(AV:N/AC:M/Au:N/C:N/I:P/A:N)",
              "accessVector" : "NETWORK",
              "accessComplexity" : "MEDIUM",
              "authentication" : "NONE",
              "confidentialityImpact" : "NONE",
              "integrityImpact" : "PARTIAL",
              "availabilityImpact" : "NONE",
              "baseScore" : 4.3
            },
            "severity" : "MEDIUM",
            "exploitabilityScore" : 8.6,
            "impactScore" : 2.9,
            "obtainAllPrivilege" : false,
            "obtainUserPrivilege" : false,
            "obtainOtherPrivilege" : false,
            "userInteractionRequired" : true
          }
        },
        "publishedDate" : "2003-12-31T05:00Z",
        "lastModifiedDate" : "2017-08-08T01:29Z"
      }]
}

我希望这些键是CSV文件的标题(如lastModifiedDate,cpe23Uri等)。我可以过滤掉空白区域,并在CSV文件中包含标题和数据后选择我想要的列。

1 个答案:

答案 0 :(得分:0)

幸运的是,你的JSON数据足以让json.load()读取和解析....但只是说你希望密钥是标题不够具体 - 它们有很多不同的级别每个“条目”(如下所示)。请注意链接问题的OP如何定义输入,而且具体如何定义其中的数据如何映射到CSV文件中的值列,其格式也显示 - 不仅仅是关于映射键的一些挥手到文件头。

无论如何,这可能有助于你做到这一点。它将读取与您正在阅读的JSON对象中的顶级"CVE_Items"键相关联的列表中的每个“条目”,并将其打印出格式很好。从输出中,您应该能够选择要提取的列,并将其作为行写入CSV文件,并填写代码以执行此操作。

import json

inputfile = "some_file.json"
outputfile = "some_file.csv"

with open(outputfile, 'w', newline='') as outf:
    with open(inputfile, 'r') as fp:
        data = json.load(fp)

    # Here is where you should convert each entry into a row of CSV data.
    # All this does now is show the contents of each entry in "CVE_Items" list.
    for entry in data["CVE_Items"]:
        print(json.dumps(entry, indent=4))

您添加到问题中的示例JSON数据中单个条目的输出:

{
    "cve": {
        "CVE_data_meta": {
            "ID": "CVE-2003-1547"
        },
        "affects": {
            "vendor": {
                "vendor_data": [
                    {
                        "vendor_name": "francisco_burzi",
                        "product": {
                            "product_data": [
                                {
                                    "product_name": "php-nuke",
                                    "version": {
                                        "version_data": [
                                            {
                                                "version_value": "6.5"
                                            },
                                            {
                                                "version_value": "6.5_beta1"
                                            },
                                            {
                                                "version_value": "6.5_rc3"
                                            },
                                            {
                                                "version_value": "6.5_rc2"
                                            },
                                            {
                                                "version_value": "6.5_rc1"
                                            }
                                        ]
                                    }
                                }
                            ]
                        }
                    }
                ]
            }
        },
        "problemtype": {
            "problemtype_data": [
                {
                    "description": [
                        {
                            "lang": "en",
                            "value": "CWE-79"
                        }
                    ]
                }
            ]
        },
        "references": {
            "reference_data": [
                {
                    "url": "http://secunia.com/advisories/8478"
                },
                {
                    "url": "http://securityreason.com/securityalert/3718"
                },
                {
                    "url": "http://www.securityfocus.com/archive/1/archive/1/316925/30/25250/threaded"
                },
                {
                    "url": "http://www.securityfocus.com/archive/1/archive/1/317230/30/25220/threaded"
                },
                {
                    "url": "http://www.securityfocus.com/bid/7248"
                },
                {
                    "url": "https://exchange.xforce.ibmcloud.com/vulnerabilities/11675"
                }
            ]
        },
        "description": {
            "description_data": [
                {
                    "lang": "en",
                    "value": "Cross-site scripting (XSS) vulnerability in block-Forums.php in the Splatt Forum module for PHP-Nuke 6.x allows remote attackers to inject arbitrary web script or HTML via the subject parameter."
                }
            ]
        }
    },
    "configurations": {
        "CVE_data_version": "4.0",
        "nodes": [
            {
                "operator": "OR",
                "cpe": [
                    {
                        "vulnerable": true,
                        "cpeMatchString": "cpe:/a:francisco_burzi:php-nuke:6.5",
                        "cpe23Uri": "cpe:2.3:a:francisco_burzi:php-nuke:6.5:*:*:*:*:*:*:*"
                    },
                    {
                        "vulnerable": true,
                        "cpeMatchString": "cpe:/a:francisco_burzi:php-nuke:6.5_beta1",
                        "cpe23Uri": "cpe:2.3:a:francisco_burzi:php-nuke:6.5_beta1:*:*:*:*:*:*:*"
                    },
                    {
                        "vulnerable": true,
                        "cpeMatchString": "cpe:/a:francisco_burzi:php-nuke:6.5_rc1",
                        "cpe23Uri": "cpe:2.3:a:francisco_burzi:php-nuke:6.5_rc1:*:*:*:*:*:*:*"
                    },
                    {
                        "vulnerable": true,
                        "cpeMatchString": "cpe:/a:francisco_burzi:php-nuke:6.5_rc2",
                        "cpe23Uri": "cpe:2.3:a:francisco_burzi:php-nuke:6.5_rc2:*:*:*:*:*:*:*"
                    },
                    {
                        "vulnerable": true,
                        "cpeMatchString": "cpe:/a:francisco_burzi:php-nuke:6.5_rc3",
                        "cpe23Uri": "cpe:2.3:a:francisco_burzi:php-nuke:6.5_rc3:*:*:*:*:*:*:*"
                    }
                ]
            }
        ]
    },
    "impact": {
        "baseMetricV2": {
            "cvssV2": {
                "vectorString": "(AV:N/AC:M/Au:N/C:N/I:P/A:N)",
                "accessVector": "NETWORK",
                "accessComplexity": "MEDIUM",
                "authentication": "NONE",
                "confidentialityImpact": "NONE",
                "integrityImpact": "PARTIAL",
                "availabilityImpact": "NONE",
                "baseScore": 4.3
            },
            "severity": "MEDIUM",
            "exploitabilityScore": 8.6,
            "impactScore": 2.9,
            "obtainAllPrivilege": false,
            "obtainUserPrivilege": false,
            "obtainOtherPrivilege": false,
            "userInteractionRequired": true
        }
    },
    "publishedDate": "2003-12-31T05:00Z",
    "lastModifiedDate": "2017-08-08T01:29Z"
}