将csv文件转换为多个嵌套的json格式

时间:2019-03-26 07:22:43

标签: python

我写了一段代码,将csv文件转换为嵌套的json格式。我有多个要嵌套的列,因此分别为每个列分配。问题是我在json输出中为同一列获取2个字段。

import csv
import json
from collections import OrderedDict

csv_file = 'data.csv'
json_file = csv_file + '.json'

def main(input_file):
    csv_rows = []
    with open(input_file, 'r') as csvfile:
        reader = csv.DictReader(csvfile, delimiter='|')
        for row in reader:
            row['TYPE'] = 'REVIEW',   # adding new key, value 
            row['RAWID'] = 1,
            row['CUSTOMER'] = {
                "ID": row['CUSTOMER_ID'],
                "NAME": row['CUSTOMER_NAME']
            }
            row['CATEGORY'] = {
                "ID": row['CATEGORY_ID'],
                "NAME": row['CATEGORY']
            }
            del (row["CUSTOMER_NAME"], row["CATEGORY_ID"], 
            row["CATEGORY"], row["CUSTOMER_ID"])   # deleting since fields coccuring twice
            csv_rows.append(row)

    with open(json_file, 'w') as f:
        json.dump(csv_rows, f, sort_keys=True, indent=4, ensure_ascii=False)
        f.write('\n')

输出如下:

[
{
    "CATEGORY": {
        "ID": "1", 
        "NAME": "Consumers"
    }, 
    "CATEGORY_ID": "1",
    "CUSTOMER_ID": "41",
    "CUSTOMER": {
        "ID": "41", 
        "NAME": "SA Port"
    },
    "CUSTOMER_NAME": "SA Port",
    "RAWID": [
        1 
    ]
}
]

对于使用row ['']分配的字段,我将获得2个条目。

  1. 还有其他方法可以摆脱这种情况吗?我只希望每个记录中的特定字段有一个条目。
  2. 从csv.DictReader()读取后,如何将密钥转换为小写。在我的csv文件中,所有列都是大写的,因此我使用了相同的值进行分配。但是我想将它们全部转换为小写。

1 个答案:

答案 0 :(得分:0)

为了将键转换为小写,每行生成一个新的dict会更简单。顺便说一句,它应该足以消除重复的字段:

    for row in reader:
        orow = collection.OrderedDict()
        orow['type'] = 'REVIEW',   # adding new key, value 
        orow['rawid'] = 1,
        orow['customer'] = {
            "id": row['CUSTOMER_ID'],
            "name": row['CUSTOMER_NAME']
        }
        orow['category'] = {
            "id": row['CATEGORY_ID'],
            "name": row['CATEGORY']
        }
        csv_rows.append(orow)