Json转CSV转换

时间:2016-09-26 23:50:51

标签: python json csv

我有一个非常大的JSON文件,其中包含多个单独的JSON对象,格式如下所示。我试图将其转换为CSV,以便每行是JSON对象中的外部id / name / alphabet和1组转换的组合:id / name / alphabet。对于单个JSON对象中的所有id / name / alphabet集合重复此操作。因此,从下面的对象中,应该创建2行,其中第一行是(外部)id / name / alphabet和第一个id / name / alphabet of conversion。第二行是(外部)id / name / alphabet,现在是转换的第二个id / name / alphabet。

重要提示是文件中的某些对象可以有超过50/60的转换ID /名称/字母对。

我到目前为止尝试的是首先展平JSON对象,这导致了像conversion_id_0和conversion_id_1等等的密钥...所以我可以将外部映射为常量常量,但我不确定如何映射每个相应的数字集是一个单独的行。

非常感谢任何帮助或见解!

[
    {
        "alphabet": "ABCDEFGHIJKL",
        "conversion": [
            {
                "alphabet": "BCDEFGHIJKL",
                "id": 18589260,
                "name": [
                    "yy"
                ]
            },
            {
                "alphabet": "EFGHIJEFGHIJ",
                "id": 18056632,
                "name": [
                    "zx",
                    "cd"
                ]
            }
        ],
        "id": 23929934,
        "name": [
            "x",
            "y"
        ]
    }
]

1 个答案:

答案 0 :(得分:0)

您的问题不清楚从输入JSON数据到CSV文件行的确切映射,所以我不得不猜测当内部或外部对象有多个“名称”时会发生什么。

无论如何,希望以下内容能够让您大致了解如何解决这些问题。

import csv

objects = [
    {
        "alphabet": "ABCDEFGHIJKL",
        "id": 23929934,
        "name": [
            "x",
            "y"
        ],
        "conversion": [
            {
                "alphabet": "BCDEFGHIJKL",
                "id": 18589260,
                "name": [
                    "yy"
                ]
            },
            {
                "alphabet": "EFGHIJEFGHIJ",
                "id": 18056632,
                "name": [
                    "zx",
                    "cd"
                ]
            }
        ],
    }
]

with open('converted_json.csv', 'wb') as outfile:
    def group(item):
        return [item["id"], item["alphabet"], ' '.join(item["name"])]

    writer = csv.writer(outfile, quoting=csv.QUOTE_NONNUMERIC)
    for obj in objects:
        outer = group(obj)
        for conversion in obj["conversion"]:
            inner = group(conversion)
            writer.writerow(outer + inner)

生成的CSV文件的内容:

23929934,"ABCDEFGHIJKL","x y",18589260,"BCDEFGHIJKL","yy"
23929934,"ABCDEFGHIJKL","x y",18056632,"EFGHIJEFGHIJ","zx cd"